{"record":{"id":"4da9704ad8febc16","repo":"deepseek-ai/deepseek-harness","slug":"sandbox-local-runnercommand-requires-at-least-one","errorCode":null,"errorMessage":"sandbox-local: runnerCommand requires at least one runnerFailureSignatures entry","messagePattern":"sandbox-local: runnerCommand requires at least one runnerFailureSignatures entry","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/sandbox/sandbox-local/src/index.ts","lineNumber":287,"sourceCode":"   * cache and outlives the provider — never revoked) and the REVOCABLE\n   * private-temp grant per live session/workspace pair (revoked on provider\n   * dispose).\n   */\n  private readonly workspaceGrants = new Map<string, AclWriteGrant>()\n  private readonly tempCapabilities = new Map<string, AclTempCapability>()\n\n  constructor(ctx: Context, config: Config) {\n    super(ctx)\n    // The schema (static Config) defaults every field — the casts record\n    // those runtime facts. An empty runnerCommand means \"not configured\":\n    // use the platform chain.\n    const runner = config.runnerCommand as string[]\n    const runnerFailureSignatures = config.runnerFailureSignatures as string[]\n    if (runner.length === 0 && runnerFailureSignatures.length > 0) {\n      throw new Error('sandbox-local: runnerFailureSignatures requires runnerCommand')\n    }\n    if (runner.length > 0 && runnerFailureSignatures.length === 0) {\n      throw new Error('sandbox-local: runnerCommand requires at least one runnerFailureSignatures entry')\n    }\n    if (runnerFailureSignatures.some(signature => signature.trim().length === 0 || /[\\r\\n]/u.test(signature))) {\n      throw new Error('sandbox-local: runnerFailureSignatures entries must be non-empty single-line strings')\n    }\n    this.runnerCommand = runner.length > 0 ? runner : undefined\n    this.configuredRunnerFailureSignatures = runnerFailureSignatures\n    this.probeTimeoutMs = config.probeTimeoutMs as number\n    assertPositiveFinite('probeTimeoutMs', this.probeTimeoutMs)\n    // The temp grants are revoked with the provider: a clean server\n    // shutdown leaves no temp ACEs behind (workspace ACEs stand by design —\n    // the reuse cache; an unclean shutdown leaves them for the next\n    // provision's exact-ACE skip).\n    ctx.effect(() => () => {\n      this.revokeAclGrants()\n    })\n  }\n\n  /**","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/sandbox/sandbox-local/src/index.ts#L269-L305","documentation":"Error \"sandbox-local: runnerCommand requires at least one runnerFailureSignatures entry\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/sandbox/sandbox-local/src/index.ts:287 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add at least one runnerFailureSignatures entry, or remove runnerCommand."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}