{"record":{"id":"a914940f89116214","repo":"Yeachan-Heo/oh-my-codex","slug":"missing-evidence","errorCode":null,"errorMessage":"Missing --evidence.","messagePattern":"Missing --evidence\\.","errorType":"exception","errorClass":"UltragoalError","httpStatus":null,"severity":"error","filePath":"src/cli/ultragoal.ts","lineNumber":461,"sourceCode":"        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);\n        if (!result.accepted) process.exitCode = 1;\n        return;\n      }\n      const proposal = await parseSteeringProposal(rest);\n      if (!proposal.evidence?.trim?.()) throw new UltragoalError('Missing --evidence.');\n      if (!proposal.rationale?.trim?.()) throw new UltragoalError('Missing --rationale.');\n      proposal.source = parseSteeringSource(source, proposal.source);\n      const result = await steerUltragoal(cwd, proposal, { directiveText: buildSteerDirectiveText(rest) });\n      printSteerResult(proposal, result, json);\n      if (!result.accepted) process.exitCode = 1;\n      return;\n    }\n\n    if (command === 'record-review-blockers') {\n      const goalId = readValue(rest, '--goal-id');\n      const title = readValue(rest, '--title');\n      const objective = readValue(rest, '--objective');\n      const evidence = readValue(rest, '--evidence');\n      if (!goalId) throw new UltragoalError('Missing --goal-id.');\n      if (!title?.trim()) throw new UltragoalError('Missing --title.');\n      if (!objective?.trim()) throw new UltragoalError('Missing --objective.');\n      if (!evidence?.trim()) throw new UltragoalError('Missing --evidence.');\n      const codexGoal = await parseCodexGoalJson(readValue(rest, '--codex-goal-json'));","sourceCodeStart":443,"sourceCodeEnd":479,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/cli/ultragoal.ts#L443-L479","documentation":"Every structured steering proposal must carry non-empty evidence (why the mutation is justified) — enforced after parseSteeringProposal in the steer command. Both --evidence as a flag and evidence inside --after-json/--directive-json count; the guard uses evidence?.trim?.() so proposals lacking the field entirely also fail.","triggerScenarios":"`omx ultragoal steer --kind update_goal ...` with no --evidence and no evidence key in the JSON proposal; or evidence being only whitespace.","commonSituations":"Treating evidence as optional metadata; proposal JSON built programmatically that omits evidence; merging older proposal templates without the field.","solutions":["Add `--evidence \"...\"` citing concrete artifacts (test run, log, review link)","If using --after-json/--directive-json, include a non-empty \"evidence\" string in the object"],"exampleFix":"# before\nomx ultragoal steer --kind update_goal --goal-id g1 --status paused --rationale 'flaky'\n# Error: Missing --evidence.\n\n# after\nomx ultragoal steer --kind update_goal --goal-id g1 --status paused --evidence 'ci run 1234 red' --rationale 'flaky'","handlingStrategy":"validation","validationCode":"if (!evidence?.trim()) { console.error('steer requires non-empty --evidence'); process.exit(2); }","typeGuard":"function hasEvidence(p: { evidence?: string }): boolean {\n  return typeof p.evidence === 'string' && p.evidence.trim().length > 0;\n}","tryCatchPattern":null,"preventionTips":["Always pair evidence (facts) with rationale (reasoning) in steering proposals","Include 'evidence' key in generated --after-json objects"],"tags":["cli","ultragoal","steering","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"}