Yeachan-Heo/oh-my-codex · error · MissionCommandError

mission mark requires --task <id> --status <blocked|needs-hu

Error message

mission mark requires --task <id> --status <blocked|needs-human-review>.

What it means

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>.

Source

Thrown at src/cli/mission.ts:236

      const value = readValue(commandArgs, index, arg);
      if (value !== "blocked" && value !== "needs-human-review") throw new MissionCommandError(`Unsupported mission mark status: ${value}`);
      markStatus = value;
      index += 1;
      continue;
    }
    if (arg.startsWith("--")) throw new MissionCommandError(`Unknown mission option: ${arg}`);
    if (!file) {
      file = arg;
      continue;
    }
    throw new MissionCommandError(`Unexpected mission argument: ${arg}`);
  }

  if (!file) throw new MissionCommandError(`Missing mission input file.\n\n${MISSION_HELP}`);
  if (action !== "rerun" && action !== "mark" && taskId) throw new MissionCommandError(`--task is only supported for mission mark/rerun.`);
  if (action === "rerun" && !taskId) throw new MissionCommandError(`mission rerun requires --task <id>.`);
  if (action !== "mark" && markStatus) throw new MissionCommandError(`--status is only supported for mission mark.`);
  if (action === "mark" && (!taskId || !markStatus)) throw new MissionCommandError(`mission mark requires --task <id> --status <blocked|needs-human-review>.`);
  return { action, file, dryRun, continueOnError, json, slug, summaryPath, taskId, markStatus, codexArgs };
}

function missionCounts(tasks: MissionTask[]): MissionSummary["counts"] {
  return {
    total: tasks.length,
    planned: tasks.filter((task) => task.status === "planned").length,
    passed: tasks.filter((task) => task.status === "passed").length,
    failed: tasks.filter((task) => task.status === "failed").length,
    skipped: tasks.filter((task) => task.status === "skipped").length,
    blocked: tasks.filter((task) => task.status === "blocked").length,
    "needs-human-review": tasks.filter((task) => task.status === "needs-human-review").length,
  };
}

function missionStatus(tasks: MissionTask[]): MissionSummary["status"] {
  if (tasks.some((task) => task.status === "running")) return "running";
  if (tasks.some((task) => task.status === "blocked")) return "blocked";

View on GitHub (pinned to 3ad79a8a6f)

Solutions

  1. Supply both flags: mission mark <file> --task <id> --status <blocked|needs-human-review>
  2. Check mission status output for the exact task id to use

Example fix

# before
mission mark mission.md --task t1
# after
mission mark mission.md --task t1 --status blocked
Defensive patterns

Strategy: validation

Validate before calling

if (action === 'mark' && !(taskId && markStatus)) failEarly('mark needs --task and --status');

Prevention

When it happens

Trigger: `mission mark m.md` alone, `mission mark m.md --task t1` (no status), or `mission mark m.md --status blocked` (no task).

Common situations: Half-writing a mark command; providing --status in the wrong form so it parses as unknown option instead of setting markStatus.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27). Data as JSON: /api/errors/0be71cacf596b4e7. Report an issue: GitHub.