{"record":{"id":"b3e6c0591d7c0b17","repo":"Yeachan-Heo/oh-my-codex","slug":"scale-down-cleanup-debt-invalid-worktree-metadata","errorCode":null,"errorMessage":"scale_down_cleanup_debt_invalid_worktree_metadata:${worker.name}","messagePattern":"scale_down_cleanup_debt_invalid_worktree_metadata:(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/team/scaling.ts","lineNumber":1587,"sourceCode":"  const reportedRepoRoot = (repoRootResult.stdout || '').trim();\n  if (repoRootResult.status === 0 && reportedRepoRoot) {\n    repoRoot = await realpath(resolve(reportedRepoRoot));\n  }\n  const canonicalTeamStateRoot = await realpath(resolve(teamStateRoot));\n  const expectedWorkerRoot = join(canonicalTeamStateRoot, 'team', teamName, 'workers');\n\n  for (const worker of workers) {\n    const expectedWorkerDirectory = join(expectedWorkerRoot, worker.name);\n    await assertExistingPathParentContained(expectedWorkerDirectory, canonicalTeamStateRoot);\n    if (worker.team_state_root !== undefined\n      && (!isAbsolute(worker.team_state_root) || worker.team_state_root !== resolve(worker.team_state_root)\n        || resolve(worker.team_state_root) !== canonicalTeamStateRoot)) {\n      throw new Error(`scale_down_cleanup_debt_invalid_team_state_root:${worker.name}`);\n    }\n    if (worker.worktree_path === undefined) {\n      if (worker.worktree_repo_root !== undefined || worker.worktree_branch !== undefined\n        || worker.worktree_detached !== undefined || worker.worktree_created !== undefined) {\n        throw new Error(`scale_down_cleanup_debt_invalid_worktree_metadata:${worker.name}`);\n      }\n      continue;\n    }\n\n    const expectedWorktreePath = join(repoRoot, '.omx', 'team', teamName, 'worktrees', worker.name);\n    if (!isAbsolute(worker.worktree_path) || worker.worktree_path !== resolve(worker.worktree_path)\n      || resolve(worker.worktree_path) !== expectedWorktreePath\n      || (worker.worktree_repo_root !== undefined && (\n        !isAbsolute(worker.worktree_repo_root)\n        || worker.worktree_repo_root !== resolve(worker.worktree_repo_root)\n        || resolve(worker.worktree_repo_root) !== repoRoot\n      ))\n      || (worker.worktree_detached !== undefined && typeof worker.worktree_detached !== 'boolean')\n      || (worker.worktree_created !== undefined && typeof worker.worktree_created !== 'boolean')\n      || (worker.worktree_created === true && (\n        typeof worker.worktree_repo_root !== 'string' || typeof worker.worktree_detached !== 'boolean'\n      ))) {\n      throw new Error(`scale_down_cleanup_debt_invalid_worktree_target:${worker.name}`);","sourceCodeStart":1569,"sourceCodeEnd":1605,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/team/scaling.ts#L1569-L1605","documentation":"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.","triggerScenarios":"validateScaleDownCleanupResources finds worker.worktree_path undefined while any of the other worktree metadata fields are defined.","commonSituations":"Hand-edited or partially migrated team config; older config versions writing metadata without the path; a torn write leaving inconsistent fields.","solutions":["Edit the team config and remove orphan worktree metadata fields (or fill in worktree_path) for the named worker","Regenerate team config via scale-down/scale-up cycle from a clean state if editing is not feasible"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"function worktreeMetadataConsistent(w: { worktree_path?: string; worktree_repo_root?: string; worktree_branch?: string; worktree_detached?: boolean; worktree_created?: boolean }): boolean {\n  if (w.worktree_path === undefined) {\n    return w.worktree_repo_root === undefined && w.worktree_branch === undefined\n      && w.worktree_detached === undefined && w.worktree_created === undefined;\n  }\n  return true;\n}","typeGuard":"function isCleanWorkerRecord(w: WorkerInfo): boolean {\n  return worktreeMetadataConsistent(w);\n}","tryCatchPattern":"catch (e) {\n  const m = /scale_down_cleanup_debt_invalid_worktree_metadata:(.+)$/.exec(String((e as Error).message));\n  if (m) { await stripOrphanWorktreeFields(team, m[1]); return retryScaleDown(); }\n  throw e;\n}","preventionTips":["Never hand-edit team config worktree fields partially","Use the tool's scale operations to add/remove workers so metadata stays consistent"],"tags":["team","scale-down","config","worktree","validation"],"backgroundTag":"config-validation-failed","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}