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

scale_down_cleanup_debt_invalid_worktree_metadata:${worker.n

Error message

scale_down_cleanup_debt_invalid_worktree_metadata:${worker.name}

What it means

A worker with no worktree_path set still carries worktree metadata fields (worktree_repo_root, worktree_branch, worktree_detached, or worktree_created), an inconsistent combination. The message embeds the worker name.

Source

Thrown at src/team/scaling.ts:1587

  const reportedRepoRoot = (repoRootResult.stdout || '').trim();
  if (repoRootResult.status === 0 && reportedRepoRoot) {
    repoRoot = await realpath(resolve(reportedRepoRoot));
  }
  const canonicalTeamStateRoot = await realpath(resolve(teamStateRoot));
  const expectedWorkerRoot = join(canonicalTeamStateRoot, 'team', teamName, 'workers');

  for (const worker of workers) {
    const expectedWorkerDirectory = join(expectedWorkerRoot, worker.name);
    await assertExistingPathParentContained(expectedWorkerDirectory, canonicalTeamStateRoot);
    if (worker.team_state_root !== undefined
      && (!isAbsolute(worker.team_state_root) || worker.team_state_root !== resolve(worker.team_state_root)
        || resolve(worker.team_state_root) !== canonicalTeamStateRoot)) {
      throw new Error(`scale_down_cleanup_debt_invalid_team_state_root:${worker.name}`);
    }
    if (worker.worktree_path === undefined) {
      if (worker.worktree_repo_root !== undefined || worker.worktree_branch !== undefined
        || worker.worktree_detached !== undefined || worker.worktree_created !== undefined) {
        throw new Error(`scale_down_cleanup_debt_invalid_worktree_metadata:${worker.name}`);
      }
      continue;
    }

    const expectedWorktreePath = join(repoRoot, '.omx', 'team', teamName, 'worktrees', worker.name);
    if (!isAbsolute(worker.worktree_path) || worker.worktree_path !== resolve(worker.worktree_path)
      || resolve(worker.worktree_path) !== expectedWorktreePath
      || (worker.worktree_repo_root !== undefined && (
        !isAbsolute(worker.worktree_repo_root)
        || worker.worktree_repo_root !== resolve(worker.worktree_repo_root)
        || resolve(worker.worktree_repo_root) !== repoRoot
      ))
      || (worker.worktree_detached !== undefined && typeof worker.worktree_detached !== 'boolean')
      || (worker.worktree_created !== undefined && typeof worker.worktree_created !== 'boolean')
      || (worker.worktree_created === true && (
        typeof worker.worktree_repo_root !== 'string' || typeof worker.worktree_detached !== 'boolean'
      ))) {
      throw new Error(`scale_down_cleanup_debt_invalid_worktree_target:${worker.name}`);

View on GitHub (pinned to 3ad79a8a6f)

Solutions

  1. Edit the team config and remove orphan worktree metadata fields (or fill in worktree_path) for the named worker
  2. Regenerate team config via scale-down/scale-up cycle from a clean state if editing is not feasible
Defensive patterns

Strategy: type-guard

Validate before calling

function worktreeMetadataConsistent(w: { worktree_path?: string; worktree_repo_root?: string; worktree_branch?: string; worktree_detached?: boolean; worktree_created?: boolean }): boolean {
  if (w.worktree_path === undefined) {
    return w.worktree_repo_root === undefined && w.worktree_branch === undefined
      && w.worktree_detached === undefined && w.worktree_created === undefined;
  }
  return true;
}

Type guard

function isCleanWorkerRecord(w: WorkerInfo): boolean {
  return worktreeMetadataConsistent(w);
}

Try / catch

catch (e) {
  const m = /scale_down_cleanup_debt_invalid_worktree_metadata:(.+)$/.exec(String((e as Error).message));
  if (m) { await stripOrphanWorktreeFields(team, m[1]); return retryScaleDown(); }
  throw e;
}

Prevention

When it happens

Trigger: validateScaleDownCleanupResources finds worker.worktree_path undefined while any of the other worktree metadata fields are defined.

Common situations: Hand-edited or partially migrated team config; older config versions writing metadata without the path; a torn write leaving inconsistent fields.

Understand the failure class

Background: Config validation failed: what "invalid value for {key}" and settings-rejection errors mean across 19 open-source libraries — this error's family across 19 libraries.

Related errors


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