deepseek-ai/deepseek-harness · error · Error

Ralph workflow returned an invalid blocked report

Error message

Ralph workflow returned an invalid blocked report

What it means

Thrown while decoding a round report returned by the Ralph workflow provider (the worker/subprocess side) before it crosses into the consumer. The generic shape checks already passed, but the field values are inconsistent with the declared 'blocked' status — specifically the blocker string is missing, empty, or not normalized. This is a defensive validation of an external process boundary: the workflow itself produced a malformed blocked report, not the caller.

Solutions

  1. Ensure blocked reports carry a concrete blocker string; fix the workflow's report validation or prompt.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/workflow/tool-ralph/src/index.ts:273 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/d02e78703aef49dc. Report an issue: GitHub.

Appendix: source

Thrown at packages/workflow/tool-ralph/src/index.ts:273

    || value['blocker'] !== value['blocker'].trim()) {
    throw new Error('Ralph workflow returned a malformed round report')
  }
  const report: RalphRoundReport = {
    status: expectedStatus,
    summary: value['summary'],
    evidence: value['evidence'],
    nextSteps: value['nextSteps'],
    blocker: value['blocker'],
  }
  if (expectedStatus === 'continue' && (report.nextSteps.length === 0 || report.blocker !== '')) {
    throw new Error('Ralph workflow returned an invalid continuing report')
  }
  if (expectedStatus === 'complete'
    && (report.evidence.length === 0 || report.nextSteps.length !== 0 || report.blocker !== '')) {
    throw new Error('Ralph workflow returned an invalid completion report')
  }
  if (expectedStatus === 'blocked' && !normalizedText(report.blocker)) {
    throw new Error('Ralph workflow returned an invalid blocked report')
  }
  const chars = JSON.stringify(report).length
  if (chars > maxChars) {
    throw new Error(`Ralph workflow returned an oversized handoff (${chars} > ${maxChars})`)
  }
  return report
}

/** Defensively decode the fixed script's terminal value. */
function readRunResult(value: unknown, maxRounds: number, maxHandoffChars: number): RalphTerminalResult {
  if (!isRecord(value)
    || typeof value['roundsStarted'] !== 'number'
    || !Number.isSafeInteger(value['roundsStarted'])
    || value['roundsStarted'] < 1
    || value['roundsStarted'] > maxRounds) {
    throw new Error('Ralph workflow returned a malformed terminal result')
  }
  const roundsStarted = value['roundsStarted']

View on GitHub (pinned to b150a551b8)