deepseek-ai/deepseek-harness · error
skill-filesystem: failed to watch ${state.root.path}: ${erro
Error message
skill-filesystem: failed to watch ${state.root.path}: ${errorMessage(error)} What it means
Error "skill-filesystem: failed to watch ${state.root.path}: ${errorMessage(error)}" thrown in deepseek-ai/deepseek-harness.
Source
Thrown at packages/skill/skill-filesystem/src/index.ts:428
if (this.closing || state.owners.size === 0) return
try {
const watcher = await this.openStableWatcher(state)
/* v8 ignore next -- The loop returns no handle only when teardown wins between awaited probes. */
if (watcher === undefined) return
/* v8 ignore start -- Post-open teardown is timing-dependent; the disposal race has an explicit integration test. */
// oxlint-disable-next-line typescript/no-unnecessary-condition -- teardown can race awaited watcher startup
if (this.closing || state.owners.size === 0) {
await this.closeWatcher(watcher)
return
}
/* v8 ignore stop */
state.watcher = watcher
state.unhealthy = false
} catch (error) {
// oxlint-disable-next-line typescript/no-unnecessary-condition -- teardown can race awaited watcher startup
if (!this.closing) {
state.unhealthy = true
this.ctx.logger.warn(`skill-filesystem: failed to watch ${state.root.path}: ${errorMessage(error)}`)
}
throw error
}
}
// TODO(file-watch-service): Extract Chokidar and missing-root observation below into a Cordis
// service; keep skill filtering and invalidation here.
private async openStableWatcher(state: RootWatchState): Promise<WatchHandle | undefined> {
while (!this.closing && state.owners.size > 0) {
const mode = await resolveRootWatchMode(state.root.path, this.config.followSymlinks)
const watcher = mode.kind === 'ancestor'
? this.openAncestorWatcher(state, mode)
: await this.openRootWatcher(state, mode)
const current = await resolveRootWatchMode(state.root.path, this.config.followSymlinks)
/* v8 ignore else -- A host path transition between the two probes is timing-dependent. */
if (sameWatchMode(mode, current)) return watcher
/* v8 ignore next -- Covered by the same host path transition guard. */
await this.closeWatcher(watcher)View on GitHub (pinned to b150a551b8)
Solutions
- Check the skill root path exists and is watchable (permissions, fs watcher support).
When it happens
Trigger: Thrown at packages/skill/skill-filesystem/src/index.ts:428 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of deepseek-ai/deepseek-harness@b150a551b8 (2026-08-24).
Data as JSON: /api/errors/a42e2aac0f6f4c2f.
Report an issue: GitHub.