{"record":{"id":"162bf6c5ae5ab65e","repo":"deepseek-ai/deepseek-harness","slug":"invalid-job-label-expected-a-non-empty-string","errorCode":null,"errorMessage":"invalid job label: expected a non-empty string","messagePattern":"invalid job label: expected a non-empty string","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/jobs/jobs-local/src/index.ts","lineNumber":136,"sourceCode":"  /** Owner agents with attached scope cleanup, mapped to the exact disposer. */\n  private ownerCleanups = new Map<Agent, () => Promise<void> | void>()\n  /** Service context used by detached settlement continuations and teardown. */\n  private readonly selfCtx: Context\n\n  constructor(ctx: Context, config: Config) {\n    super(ctx)\n    // Schemastery validates and fills the default before constructing the service.\n    this.maxConcurrentJobsPerOwner = (config as Required<Config>).maxConcurrentJobsPerOwner\n    this.selfCtx = ctx\n    ctx.effect(() => () => this.disposeAll(), 'jobs teardown')\n  }\n\n  start(spec: JobStart): JobId {\n    if (!this.servesOwner(spec.owner)) {\n      throw new Error('background jobs unavailable: no job controller serves this agent (load @deepseek-ai/dsh-tool-jobs in its composition)')\n    }\n    if (spec.kind.length === 0) throw new Error('invalid job kind: expected a non-empty string')\n    if (spec.label.length === 0) throw new Error('invalid job label: expected a non-empty string')\n    if (spec.outputLimitBytes !== undefined\n      && (!Number.isSafeInteger(spec.outputLimitBytes) || spec.outputLimitBytes <= 0)) {\n      throw new Error(`invalid outputLimitBytes: expected a positive safe integer, got ${JSON.stringify(spec.outputLimitBytes)}`)\n    }\n    if (spec.owner !== undefined) this.ensureOwnerCleanup(spec.owner)\n\n    const active = this.activeTaskCount(spec.owner)\n    if (active >= this.maxConcurrentJobsPerOwner) {\n      throw new Error(\n        `background job limit reached for this owner (limit: ${this.maxConcurrentJobsPerOwner}); use job_kill to stop an unneeded job, wait for it to finish, then retry`,\n      )\n    }\n\n    const hooks = spec.run()\n    const count = (this.counters.get(spec.kind) ?? 0) + 1\n    this.counters.set(spec.kind, count)\n    const id = JobId(`${spec.kind}-${count}`)\n","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/jobs/jobs-local/src/index.ts#L118-L154","documentation":"Error \"invalid job label: expected a non-empty string\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/jobs/jobs-local/src/index.ts:136 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass a non-empty string as the job label."],"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"}