{"record":{"id":"601526dd08cf88aa","repo":"ruvnet/ruflo","slug":"unsupported-untracked-repository-entry-path","errorCode":null,"errorMessage":"unsupported untracked repository entry: ${path}","messagePattern":"unsupported untracked repository entry: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/codex/src/harness/repository-state.ts","lineNumber":265,"sourceCode":"\nfunction untrackedManifest(repoRoot: string): UntrackedManifest {\n  const output = gitBuffer(repoRoot, ['ls-files', '--others', '--exclude-standard', '-z']);\n  const paths = splitNul(output).map(decodeGitPath).sort(codeUnitCompare);\n  assertNoPathCollisions(paths);\n  const entries = paths.map((path): UntrackedFileIdentity => {\n    const absolute = resolve(repoRoot, path);\n    assertInsideRepository(repoRoot, absolute);\n    const before = lstatSync(absolute);\n    let kind: UntrackedFileIdentity['kind'];\n    let content: Buffer;\n    if (before.isSymbolicLink()) {\n      kind = 'symlink';\n      content = Buffer.from(readlinkSync(absolute), 'utf8');\n    } else if (before.isFile()) {\n      kind = 'file';\n      content = readFileSync(absolute);\n    } else {\n      throw new Error(`unsupported untracked repository entry: ${path}`);\n    }\n    const after = lstatSync(absolute);\n    if (\n      before.mode !== after.mode\n      || before.size !== after.size\n      || before.mtimeMs !== after.mtimeMs\n      || before.ino !== after.ino\n    ) {\n      throw new Error(`repository changed while hashing untracked entry: ${path}`);\n    }\n    return {\n      path,\n      kind,\n      mode: before.mode & 0o7777,\n      bytes: content.byteLength,\n      digest: digest(content),\n    };\n  });","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/codex/src/harness/repository-state.ts#L247-L283","documentation":"While building the untracked manifest, each entry is lstat'ed and only two kinds are accepted: regular files and symlinks. Anything else — FIFO, unix socket, device node, or a directory appearing in the list — throws 'unsupported untracked repository entry'.","triggerScenarios":"An untracked named pipe (`mkfifo .claude-flow/pipe`), a socket file left by a dev server, or a device node exists inside the worktree and is not gitignored, so `git ls-files --others --exclude-standard` returns it.","commonSituations":"Local tooling (editors, language servers, dev servers) leaves sockets/FIFOs in the project tree; containerized dev environments mount device nodes into the worktree; the .gitignore does not cover the runtime scratch directory.","solutions":["Locate the entry named in the message and run `ls -la` on it to confirm its type","Delete the special file or move it outside the worktree","Add its directory/pattern to .gitignore so --exclude-standard skips it"],"exampleFix":"# find and remove untracked special files\nfind . -path ./.git -prune -o ! -type d ! -type f ! -type l -print\nrm .claude-flow/dev.sock\n# or ignore the directory\necho '.claude-flow/' >> .gitignore","handlingStrategy":"validation","validationCode":"import { lstatSync } from 'node:fs';\nfunction isSupportedEntry(abs: string): boolean {\n  const s = lstatSync(abs);\n  return s.isFile() || s.isSymbolicLink();\n}","typeGuard":null,"tryCatchPattern":"try { capture(); } catch (e) { if (/unsupported untracked repository entry/.test(String(e))) { cleanSpecialFiles(); retryCapture(); } throw e; }","preventionTips":["Keep runtime scratch (sockets, FIFOs, pidfiles) in gitignored directories","Add dev-server socket paths to .gitignore","Sweep for special files before capture: find . ! -type d ! -type f ! -type l"],"tags":["filesystem","untracked-files","git","harness"],"backgroundTag":"unsupported-file-type","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}