{"record":{"id":"5756460d03a2af68","repo":"Yeachan-Heo/oh-my-codex","slug":"autoresearch-goal-mission-slug-cannot-complete","errorCode":null,"errorMessage":"Autoresearch goal ${mission.slug} cannot complete until professor-critic validation records verdict=pass in ${mission.completion_path}.","messagePattern":"Autoresearch goal (.+?) cannot complete until professor-critic validation records verdict=pass in (.+?)\\.","errorType":"validation","errorClass":"AutoresearchGoalError","httpStatus":null,"severity":"error","filePath":"src/autoresearch/goal.ts","lineNumber":236,"sourceCode":"  mission.updated_at = now;\n  await writeMission(cwd, mission);\n  await writeFile(autoresearchGoalCompletionPath(cwd, mission.slug), `${JSON.stringify(completion, null, 2)}\\n`, 'utf-8');\n  await appendLedger(cwd, mission.slug, {\n    ts: now,\n    event: options.verdict === 'pass' ? 'validation_passed' : options.verdict === 'fail' ? 'validation_failed' : 'validation_blocked',\n    slug: mission.slug,\n    status: mission.status,\n    evidence,\n    artifact_path: options.artifactPath,\n  });\n  return { mission, completion };\n}\n\nexport async function completeAutoresearchGoal(cwd: string, slug: string, options: CompleteAutoresearchGoalOptions = {}): Promise<{ mission: AutoresearchGoalMission; completion: AutoresearchGoalCompletion }> {\n  const mission = await readAutoresearchGoal(cwd, slug);\n  const completion = await readAutoresearchGoalCompletion(cwd, mission.slug);\n  if (!completion || !completion.passed || completion.verdict !== 'pass') {\n    throw new AutoresearchGoalError(`Autoresearch goal ${mission.slug} cannot complete until professor-critic validation records verdict=pass in ${mission.completion_path}.`);\n  }\n  const reconciliation = reconcileAutoresearchCodexGoalSnapshot(\n    options.codexGoal === undefined ? null : parseCodexGoalSnapshot(options.codexGoal),\n    mission,\n    { requireSnapshot: true, requireComplete: true },\n  );\n  if (!reconciliation.ok) throw new AutoresearchGoalError(formatCodexGoalReconciliation(reconciliation));\n  const completedAt = iso(options.now);\n  mission.status = 'complete';\n  mission.updated_at = completedAt;\n  mission.completed_at = completedAt;\n  await writeMission(cwd, mission);\n  await appendLedger(cwd, mission.slug, {\n    ts: completedAt,\n    event: 'goal_completed',\n    slug: mission.slug,\n    status: mission.status,\n    evidence: completion.evidence,","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/autoresearch/goal.ts#L218-L254","documentation":"completeAutoresearchGoal requires that a professor-critic validation pass is recorded: the completion document must exist, have passed === true and verdict === 'pass'. Completing a goal without a passing validation verdict is rejected.","triggerScenarios":"Calling completeAutoresearchGoal(cwd, slug) before recordAutoresearchGoalVerdict has written a passing completion, or when the completion file records a non-pass verdict (fail, or passed === false).","commonSituations":"Automation that runs completion immediately after candidate work without the critic validation step, a failed or missing professor-critic run, or reading the wrong completion file after renaming the mission.","solutions":["Run the professor-critic validation and record verdict=pass via recordAutoresearchGoalVerdict first","Inspect ${mission.completion_path} (printed in the message) and confirm passed === true and verdict === 'pass'","If the critic verdict was fail, address the feedback and re-run validation before completing","Ensure the completion file was not deleted or written under a different slug"],"exampleFix":"// before\nawait completeAutoresearchGoal(repoRoot, 'fix-leak'); // throws: no passing verdict\n// after\nawait recordAutoresearchGoalVerdict(repoRoot, { slug: 'fix-leak', evidence: '...', /* verdict pass */ });\nawait completeAutoresearchGoal(repoRoot, 'fix-leak');","handlingStrategy":"validation","validationCode":"const completion = await readAutoresearchGoalCompletion(cwd, slug);\nif (!completion || !completion.passed || completion.verdict !== 'pass') {\n  throw new Error('Cannot complete goal: professor-critic verdict=pass not yet recorded.');\n}","typeGuard":"function hasPassingCompletion(c: { passed?: boolean; verdict?: string } | null): boolean {\n  return !!c && c.passed === true && c.verdict === 'pass';\n}","tryCatchPattern":"try { await completeAutoresearchGoal(cwd, slug); }\ncatch (e) { if (e instanceof AutoresearchGoalError && e.message.includes('verdict=pass')) { /* run critic validation, record verdict, retry */ } else throw e; }","preventionTips":["Always run professor-critic validation and record a passing verdict before completion","Check completion.passed && completion.verdict === 'pass' via readAutoresearchGoalCompletion first","Treat completion as the final step of a fixed pipeline: create -> verdicts -> complete"],"tags":["autoresearch","validation","precondition","workflow-state"],"backgroundTag":"validation-precondition-failed","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}