{"record":{"id":"4ef8cdddc3cdf593","repo":"Yeachan-Heo/oh-my-codex","slug":"missing-title","errorCode":null,"errorMessage":"Missing --title.","messagePattern":"Missing --title\\.","errorType":"exception","errorClass":"UltragoalError","httpStatus":null,"severity":"error","filePath":"src/cli/ultragoal.ts","lineNumber":438,"sourceCode":"          status: 'codex_goal_reconciliation_unavailable',\n          reason: reconciliation.snapshot.unavailableReason,\n          message: 'Codex goal DB/schema/context is unavailable; artifact-backed Ultragoal status remains available, but strict Codex goal completion reconciliation is deferred.',\n        }\n        : undefined;\n      if (json) printJson({ plan, summary: summarizeUltragoalPlan(plan), reconciliation, codexGoalFallback });\n      else {\n        printStatus(plan);\n        if (codexGoalFallback) console.log(`codex goal fallback: ${codexGoalFallback.message}`);\n        if (reconciliation && !reconciliation.ok) console.log(`codex goal warning: ${formatCodexGoalReconciliation(reconciliation)}`);\n        else if (reconciliation?.warnings.length) console.log(`codex goal warning: ${formatCodexGoalReconciliation(reconciliation)}`);\n      }\n      return;\n    }\n\n    if (command === 'add-goal') {\n      const title = readValue(rest, '--title');\n      const objective = readValue(rest, '--objective');\n      if (!title?.trim()) throw new UltragoalError('Missing --title.');\n      if (!objective?.trim()) throw new UltragoalError('Missing --objective.');\n      const result = await addUltragoalGoal(cwd, { title, objective, evidence: readValue(rest, '--evidence') });\n      if (json) printJson({ ok: true, plan: result.plan, addedGoal: result.goal, summary: summarizeUltragoalPlan(result.plan) });\n      else {\n        console.log(`ultragoal added goal: ${result.goal.id}`);\n        printStatus(result.plan);\n      }\n      return;\n    }\n\n    if (command === 'steer') {\n      const proposalText = readValue(rest, '--proposal');\n      const source = readValue(rest, '--source');\n      if (proposalText) {\n        const parsed = assertPlainObject(await readJsonInput(proposalText, '--proposal'), '--proposal');\n        const proposal = normalizeSteeringProposal({ ...parsed, source: source ?? parsed.source }, proposalText);\n        const result = await steerUltragoal(cwd, proposal, { directiveText: proposalText });\n        printSteerResult(proposal, result, json);","sourceCodeStart":420,"sourceCodeEnd":456,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/cli/ultragoal.ts#L420-L456","documentation":"The add-goal subcommand requires --title (trimmed non-empty) so every goal has a human-readable name. Omitting the flag or passing whitespace triggers this immediate validation before addUltragoalGoal runs.","triggerScenarios":"`omx ultragoal add-goal --objective 'do x'` without --title; or `--title \"   \"`.","commonSituations":"Assuming title is derived from objective; flag renamed between versions; whitespace from unquoted shell variable expansion (`--title \"$TITLE\"` with empty var).","solutions":["Add a concise `--title \"Goal name\"`","Quote shell variables and default them: `--title \"${TITLE:?set TITLE}\"`"],"exampleFix":"# before\nomx ultragoal add-goal --objective 'migrate db'\n# Error: Missing --title.\n\n# after\nomx ultragoal add-goal --title 'DB migration' --objective 'migrate db to v2'","handlingStrategy":"validation","validationCode":"if (!title?.trim()) { console.error('--title required'); process.exit(2); }","typeGuard":"function isNonEmptyString(v: string | undefined | null): v is string {\n  return typeof v === 'string' && v.trim().length > 0;\n}","tryCatchPattern":null,"preventionTips":["Use `${TITLE:?}` shell guards for flag values sourced from env","Keep a checklist of required flags for add-goal: title + objective"],"tags":["cli","ultragoal","missing-argument"],"backgroundTag":"missing-required-cli-flag","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}