deepseek-ai/deepseek-harness · error

web boot: ${String(failures.length)} entr${failures.length =

Error message

web boot: ${String(failures.length)} entr${failures.length === 1 ? 'y' : 'ies'} did not activate\n${failures.join('\n')}

What it means

After the Cordis loader reaches quiescence, AppWebEntry.assertEntriesActive audits every manifest entry. An entry with no fiber failed its import; an entry whose fiber is not active either failed during apply or is still pending because a service it injects is provided by no loaded plugin. Each offending entry contributes one line and boot aborts with the aggregate list.

Source

Thrown at packages/client/web/src/boot.ts:156

  private assertEntriesActive(ctx: Context): void {
    const failures: string[] = []
    for (const entry of ctx.loader.entries()) {
      const name = entry.options.name
      if (entry.fiber === undefined) {
        failures.push(`${name}: import failed (see console for the import error)`)
        continue
      }
      const state = STATE_LABELS[entry.fiber.state]
      if (state === 'active') continue
      if (state === 'pending') {
        const missing = Object.keys(entry.fiber.inject).filter(service => ctx.get(service) === undefined)
        failures.push(`${name}: pending (waiting for service${missing.length === 1 ? '' : 's'}: ${missing.join(', ') || 'unknown'})`)
      } else {
        failures.push(`${name}: ${state}`)
      }
    }
    if (failures.length > 0) {
      throw new Error(`web boot: ${String(failures.length)} entr${failures.length === 1 ? 'y' : 'ies'} did not activate\n${failures.join('\n')}`)
    }
  }
}

View on GitHub (pinned to b150a551b8)

Solutions

  1. Read the per-entry lines: 'import failed' means the browser console holds the import error — open it, rebuild that package (pnpm --filter <pkg> bundle), and hard-refresh.
  2. For 'pending (waiting for service X)', find which plugin should provide service X and why it is absent: missing from cordis.patch.yml, failed to load, or the service name changed.
  3. Verify the new-package checklist surfaces for the failing row: aggregate tsconfig reference, patch.yml row, bundle package.json dependency.
  4. After fixing, hard-refresh so cached bundles are bypassed before re-testing.

Example fix

# before — ui-foo row in cordis.patch.yml but its package missing from
# packages/bundle/web-app/package.json → the row cannot import
plugins:
  - '@deepseek-ai/dsh-client-ui-foo'

# after — also declare the dependency so the healed node_modules resolves the row
# packages/bundle/web-app/package.json
"dependencies": { "@deepseek-ai/dsh-client-ui-foo": "workspace:*" }
Defensive patterns

Strategy: try-catch

Validate before calling

// preflight: every manifest row's package must be resolvable before serving
for (const row of manifest.plugins) {
  try { require.resolve(row.id + '/package.json') }
  catch { throw new Error(`manifest row ${row.id} has no installed package — check the bundle dependency`) }
}

Try / catch

try {
  await entry.run()
} catch (err) {
  // err.message carries per-entry lines: 'import failed' vs 'pending (waiting for service X)'
  // route the fix by line kind; activation failures are deterministic — never retry boot in a loop
  reportBootFailure(err.message)
}

Prevention

When it happens

Trigger: A manifest plugin row throws during import (missing ./client export, broken build, stale bundle) or during apply, or stays pending because no loaded entry provides a service in its inject list — the provider plugin was removed, renamed, or itself failed to import.

Common situations: Adding a client plugin while missing one of the three registration surfaces (tsconfig.client.json aggregate reference, cordis.patch.yml row, bundle package.json dependency); renaming or removing a plugin whose service another entry injects; probing a live server against stale lib/client.js bundles after editing sources.

Related errors


AI-assisted analysis of deepseek-ai/deepseek-harness@b150a551b8 (2026-08-24). Data as JSON: /api/errors/19c833d3a0a792d2. Report an issue: GitHub.