{"record":{"id":"0be71cacf596b4e7","repo":"Yeachan-Heo/oh-my-codex","slug":"mission-mark-requires-task-id-status-blocke","errorCode":null,"errorMessage":"mission mark requires --task <id> --status <blocked|needs-human-review>.","messagePattern":"mission mark requires --task <id> --status <blocked\\|needs-human-review>\\.","errorType":"validation","errorClass":"MissionCommandError","httpStatus":null,"severity":"error","filePath":"src/cli/mission.ts","lineNumber":236,"sourceCode":"      const value = readValue(commandArgs, index, arg);\n      if (value !== \"blocked\" && value !== \"needs-human-review\") throw new MissionCommandError(`Unsupported mission mark status: ${value}`);\n      markStatus = value;\n      index += 1;\n      continue;\n    }\n    if (arg.startsWith(\"--\")) throw new MissionCommandError(`Unknown mission option: ${arg}`);\n    if (!file) {\n      file = arg;\n      continue;\n    }\n    throw new MissionCommandError(`Unexpected mission argument: ${arg}`);\n  }\n\n  if (!file) throw new MissionCommandError(`Missing mission input file.\\n\\n${MISSION_HELP}`);\n  if (action !== \"rerun\" && action !== \"mark\" && taskId) throw new MissionCommandError(`--task is only supported for mission mark/rerun.`);\n  if (action === \"rerun\" && !taskId) throw new MissionCommandError(`mission rerun requires --task <id>.`);\n  if (action !== \"mark\" && markStatus) throw new MissionCommandError(`--status is only supported for mission mark.`);\n  if (action === \"mark\" && (!taskId || !markStatus)) throw new MissionCommandError(`mission mark requires --task <id> --status <blocked|needs-human-review>.`);\n  return { action, file, dryRun, continueOnError, json, slug, summaryPath, taskId, markStatus, codexArgs };\n}\n\nfunction missionCounts(tasks: MissionTask[]): MissionSummary[\"counts\"] {\n  return {\n    total: tasks.length,\n    planned: tasks.filter((task) => task.status === \"planned\").length,\n    passed: tasks.filter((task) => task.status === \"passed\").length,\n    failed: tasks.filter((task) => task.status === \"failed\").length,\n    skipped: tasks.filter((task) => task.status === \"skipped\").length,\n    blocked: tasks.filter((task) => task.status === \"blocked\").length,\n    \"needs-human-review\": tasks.filter((task) => task.status === \"needs-human-review\").length,\n  };\n}\n\nfunction missionStatus(tasks: MissionTask[]): MissionSummary[\"status\"] {\n  if (tasks.some((task) => task.status === \"running\")) return \"running\";\n  if (tasks.some((task) => task.status === \"blocked\")) return \"blocked\";","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/cli/mission.ts#L218-L254","documentation":"Post-parse validation: mark was selected but either --task or --status (or both) is missing. mark requires the pair --task <id> --status <blocked|needs-human-review>.","triggerScenarios":"`mission mark m.md` alone, `mission mark m.md --task t1` (no status), or `mission mark m.md --status blocked` (no task).","commonSituations":"Half-writing a mark command; providing --status in the wrong form so it parses as unknown option instead of setting markStatus.","solutions":["Supply both flags: mission mark <file> --task <id> --status <blocked|needs-human-review>","Check mission status output for the exact task id to use"],"exampleFix":"# before\nmission mark mission.md --task t1\n# after\nmission mark mission.md --task t1 --status blocked","handlingStrategy":"validation","validationCode":"if (action === 'mark' && !(taskId && markStatus)) failEarly('mark needs --task and --status');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Construct mark commands from validated taskId + status variables"],"tags":["cli","missing-argument","mission"],"backgroundTag":"missing-required-argument","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}