Yeachan-Heo/oh-my-codex · error · Error
scale_down_cleanup_debt_invalid_team_state_root:${worker.nam
Error message
scale_down_cleanup_debt_invalid_team_state_root:${worker.name} What it means
A worker record's team_state_root fails validation: it must be an absolute, already-resolved path exactly equal to the canonical team state root. The message embeds the worker name.
Source
Thrown at src/team/scaling.ts:1582
const repoRootResult = spawnSync('git', ['rev-parse', '--show-toplevel'], {
cwd: leaderCwd,
encoding: 'utf-8',
windowsHide: true,
});
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')View on GitHub (pinned to 3ad79a8a6f)
Solutions
- Inspect the worker record in the team config and fix team_state_root to the exact canonical absolute path
- If the team state root moved, update all worker records (or regenerate the config) to the new canonical path
- On macOS, watch for /var -> /private/var symlink resolution differences; store the realpath
Defensive patterns
Strategy: validation
Validate before calling
import { isAbsolute, resolve } from 'node:path';
import { realpathSync } from 'node:fs';
function validTeamStateRoot(workerRoot: string | undefined, canonicalRoot: string): boolean {
return workerRoot === undefined
|| (isAbsolute(workerRoot) && workerRoot === resolve(workerRoot) && resolve(workerRoot) === realpathSync(canonicalRoot));
} Try / catch
catch (e) {
const m = /scale_down_cleanup_debt_invalid_team_state_root:(.+)$/.exec(String((e as Error).message));
if (m) { await fixWorkerRootInConfig(team, m[1]); return retryScaleDown(); }
throw e;
} Prevention
- Store realpaths (not symlinked paths) in team config
- After moving team state, migrate all worker records' team_state_root
When it happens
Trigger: validateScaleDownCleanupResources sees worker.team_state_root defined but non-absolute, non-normalized, or resolving to a different directory than the canonical root.
Common situations: Team state moved or the config was hand-edited; macOS /var vs /private/var or case differences (Windows) causing resolve() mismatch; stale config from an older version storing relative roots.
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
- scale_down_cleanup_debt_invalid_worktree_metadata:${worker.n
- scale_down_cleanup_debt_invalid_worktree_target:${worker.nam
- canonical_scale_down_config_missing
- ${guidance}Invalid reasoning mode "${mode}". Expected one of
- tmux-hook config must be a JSON object
AI-assisted analysis of Yeachan-Heo/oh-my-codex@3ad79a8a6f (2026-08-27).
Data as JSON: /api/errors/5a28c1a762385de0.
Report an issue: GitHub.