abhigyanpatwari/GitNexus · error
Unsupported analyzer runtime payload entry
Error message
Unsupported analyzer runtime payload entry: ${absolutePath} What it means
During the runtime payload walk, an entry must be a regular file, a symbolic link, or a directory; anything else (FIFO, socket, device node, or a stat result reporting none of these kinds) is rejected with this error naming the offending absolute path. The hasher refuses to include or skip exotic filesystem entries because they cannot be hashed deterministically and could hide mutation, so identity computation fails closed.
Solutions
- Remove the special file named in the message: rm <absolutePath> (verify it is not an active service socket first — stop the process that owns it).
- Move runtime state (sockets, pipes, caches) out of the gitnexus package/build tree, e.g. point TMPDIR and serve working dirs elsewhere.
- If it recurs from a container mount, re-run the analysis on a plain local filesystem path instead of the special mount.
- Re-run analyze after cleanup to confirm the walk completes.
Example fix
# before: serve creates a socket inside the package tree $ gitnexus serve & # writes gitnexus.sock under package root $ npx gitnexus analyze # Unsupported analyzer runtime payload entry: /.../gitnexus.sock # after: keep runtime sockets out of the scanned tree $ gitnexus serve --workdir /tmp/gitnexus-serve & npx gitnexus analyze
Defensive patterns
Strategy: validation
Validate before calling
// Pre-flight: reject special files in the trees you control before analyze:
import { readdirSync, statSync } from 'node:fs';
import { join } from 'node:path';
function findNonRegularEntries(root: string): string[] {
const bad: string[] = [];
for (const entry of readdirSync(root, { withFileTypes: true })) {
const p = join(root, entry.name);
const s = statSync(p); // throws on broken symlink; wrap if needed
if (!s.isFile() && !s.isSymbolicLink() && !s.isDirectory()) bad.push(p);
else if (s.isDirectory()) bad.push(...findNonRegularEntries(p));
}
return bad;
} Try / catch
try {
await analyze({ repo: '.' });
} catch (err) {
if (err instanceof Error && err.message.startsWith('Unsupported analyzer runtime payload entry:')) {
const path = err.message.slice('Unsupported analyzer runtime payload entry: '.length);
await fs.rm(path, { force: true }); // after confirming it is not an active socket
return analyze({ repo: '.' });
}
throw err;
} Prevention
- Keep long-running services (serve, watchers) from creating sockets/pipes inside the analyzer package tree.
- Set TMPDIR and runtime state dirs outside the scanned installation.
- Avoid analyzing trees on exotic mounts that synthesize special device nodes.
- Treat recurrence as a signal a process is actively writing into the install.
When it happens
Trigger: resolveAnalyzerRunnerIdentity() walking the analyzer package/build trees encounters a directory entry where !stat.isFile() && !stat.isSymbolicLink() && the entry was not handled as a directory earlier — e.g. mkfifo pipes, unix sockets created by a running server inside the tree, /dev-style special files bind-mounted in containers, or broken stat kinds on exotic filesystems.
Common situations: Running `gitnexus serve` or a dev watcher whose working directories sit inside the analyzed package tree and create socket/pid/named-pipe files; Docker volumes with special device nodes; WSL or network filesystems returning unusual d_type values.
Related errors
- Analyzer package lock is not a regular file
- Unsupported analyzer build entry
- Analyzer build changed while its identity was being computed
- Analyzer identity directory changed while it was read
- Analyzer identity input changed while it was being read
AI-assisted analysis of abhigyanpatwari/GitNexus@52924ef12c (2026-08-20).
Data as JSON: /api/errors/46fc63c97f95a4ac.
Report an issue: GitHub.
Appendix: source
Thrown at gitnexus/src/core/analyzer-identity.ts:1414
budget.artifacts += 1;
if (budget.artifacts > limits.runtimePayloads) {
throw new Error(
`Analyzer runtime payload scan exceeded ${limits.runtimePayloads} payloads: ${root}`,
);
}
if (budget.bytes + payloadBytes > limits.runtimeBytes) {
throw new Error(
`Analyzer runtime scan exceeded ${limits.runtimeBytes} bytes: ${absolutePath}`,
);
}
budget.bytes += payloadBytes;
artifacts.push({
absolutePath,
canonicalPath: `${canonicalPrefix}/${relativePath}`,
kind: stat.isSymbolicLink() ? 'symlink' : 'file',
});
} else if (!stat.isFile() && !stat.isSymbolicLink()) {
throw new Error(`Unsupported analyzer runtime payload entry: ${absolutePath}`);
}
}
}
return artifacts;
}
function collectVendoredGrammarInputs(
packageRoot: string,
directoryGuards: Map<string, DependencyDirectoryGuard>,
options: AnalyzerIdentityResolveOptions,
budget: RuntimeArtifactScanBudget,
limits: AnalyzerIdentityTraversalLimits,
): {
manifests: DependencyInputs['vendoredManifests'];
artifacts: RuntimeArtifact[];
} {
const vendorRoot = path.join(packageRoot, 'vendor');
if (!existsSync(vendorRoot) || !lstatSync(vendorRoot).isDirectory()) {View on GitHub (pinned to 52924ef12c)