tinyhumansai/openhuman · error · SpecError

tracking_issue must be a positive integer

Error message

tracking_issue must be a positive integer

What it means

The top-level tracking_issue must satisfy Number.isInteger(x) && x > 0, tying the batch to one GitHub issue that tracks overall progress. The check fails for non-numbers, non-integers, zero, and negatives. A JSON string like "5312" is intentionally rejected — no string-to-number coercion is done.

Source

Thrown at scripts/agent-batch/lib.mjs:69

    typeof spec.batch_id !== "string" ||
    !/^[a-z0-9][a-z0-9-]*$/.test(spec.batch_id)
  ) {
    throw new SpecError("batch_id must be a kebab-case slug", "batch_id");
  }
  if (spec.base_repo !== "tinyhumansai/openhuman") {
    throw new SpecError(
      `base_repo must be "tinyhumansai/openhuman" (got "${spec.base_repo}")`,
      "base_repo",
    );
  }
  if (spec.base_branch !== "main") {
    throw new SpecError(
      `base_branch must be "main" (got "${spec.base_branch}")`,
      "base_branch",
    );
  }
  if (!Number.isInteger(spec.tracking_issue) || spec.tracking_issue <= 0) {
    throw new SpecError(
      "tracking_issue must be a positive integer",
      "tracking_issue",
    );
  }
  if (!Array.isArray(spec.agents) || spec.agents.length === 0) {
    throw new SpecError("agents must be a non-empty array", "agents");
  }
  if (spec.agents.length > 25) {
    throw new SpecError(
      `batch size ${spec.agents.length} exceeds hard cap of 25`,
      "agents",
    );
  }

  const seenId = new Set();
  const seenIssue = new Set();
  const seenBranch = new Set();
  for (let i = 0; i < spec.agents.length; i++) {

View on GitHub (pinned to a221052e0d)

Solutions

  1. Open (or pick) the tracking issue first, then set tracking_issue to its unquoted positive integer, e.g. 5312
  2. Remove quotes around the number in the spec file
  3. If generating specs programmatically, coerce with Number.parseInt and re-check Number.isInteger before serializing

Example fix

// before
"tracking_issue": "5312"

// after
"tracking_issue": 5312
Defensive patterns

Strategy: validation

Validate before calling

if (!Number.isInteger(spec.tracking_issue) || spec.tracking_issue <= 0) {
  console.error("tracking_issue must be a positive integer");
  process.exit(1);
}

Type guard

/** @param {unknown} v */
function isPositiveInt(v) {
  return typeof v === "number" && Number.isInteger(v) && v > 0;
}

Try / catch

try {
  validateSpec(spec);
} catch (e) {
  if (e instanceof SpecError && e.path === "tracking_issue") {
    console.error(`open the tracking GitHub issue first, then set the number: ${e.message}`);
    process.exit(1);
  }
  throw e;
}

Prevention

When it happens

Trigger: "tracking_issue": 0, -5, 1.5, "5312" (string), or null in the spec passed to validateSpec.

Common situations: Hand-writing the JSON and quoting the issue number out of habit; generating the spec from a form/CLI that yields strings; leaving a placeholder 0 while the tracking issue has not been opened yet.

Related errors


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/56827d6cae8f0513. Report an issue: GitHub.