plandex-ai/plandex · error

invalid line numbers: %d-%d

Error message

invalid line numbers: %d-%d

What it means

For multi-line replacements, the extracted first/last line numbers must satisfy: 1 <= first <= fileLen, last > first, and last <= fileLen. This error is returned when the range is empty, inverted, or extends beyond the file.

Source

Thrown at app/server/model/plan/build_validate_and_fix.go:426

		if lastLine != "" {
			lastLineNum, err = shared.ExtractLineNumberWithPrefix(lastLine, "pdx-")
			if err != nil {
				log.Printf("Error extracting line number from last line: %v", err)
				return buildValidateResult{valid: false, updated: updated}, fmt.Errorf("error extracting line number from last line: %v", err)
			}
		}

		if lastLineNum == 0 {
			if !(firstLineNum > 0 && firstLineNum <= len(originalFileLines)) {
				log.Printf("Invalid line number for first line: %d", firstLineNum)
				return buildValidateResult{valid: false, updated: updated}, fmt.Errorf("invalid line number for first line: %d", firstLineNum)
			}
			old = originalFileLines[firstLineNum-1]
		} else {
			if !(firstLineNum > 0 && firstLineNum <= len(originalFileLines) && lastLineNum > firstLineNum && lastLineNum <= len(originalFileLines)) {
				log.Printf("Invalid line numbers for first and last lines: %d-%d", firstLineNum, lastLineNum)
				return buildValidateResult{valid: false, updated: updated}, fmt.Errorf("invalid line numbers: %d-%d", firstLineNum, lastLineNum)
			}
			old = strings.Join(originalFileLines[firstLineNum-1:lastLineNum], "\n")
		}

		// log.Printf("Applying replacement.\n\nOld:\n\n%s\n\nNew:\n\n%s", old, new)

		incremental = shared.LineNumberedTextType(strings.Replace(string(incremental), old, new, 1))

		// log.Printf("Updated content:\n\n%s", string(incremental))
	}

	var problem string

	if strings.Contains(content, "<PlandexIncorrect/>") {
		split := strings.Split(content, "<PlandexIncorrect/>")
		problem = split[0]
	} else if strings.Contains(content, "<PlandexReplacements>") {
		split := strings.Split(content, "<PlandexReplacements>")

View on GitHub (pinned to e2d772072e)

Solutions

  1. Retry with refreshed file line numbers in context
  2. Validate the range ordering before sending to the model and ask for corrections
  3. Fall back to a whole-file build when range validation repeatedly fails
Defensive patterns

Strategy: validation

Validate before calling

if !(firstLineNum > 0 && firstLineNum <= len(originalFileLines) && lastLineNum > firstLineNum && lastLineNum <= len(originalFileLines)) {
    return fmt.Errorf("invalid line range %d-%d (file has %d lines)", firstLineNum, lastLineNum, len(originalFileLines))
}

Type guard

func validLineRange(first, last, fileLen int) bool {
    return first > 0 && first <= fileLen && last > first && last <= fileLen
}

Prevention

When it happens

Trigger: Model returns last <= first (inverted or single-line range given as a range) or last > number of lines in the original file.

Common situations: Stale line numbers after the file was edited by a prior change, model miscounting on large files, or swapping first/last lines.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/0da05c3480bda405. Report an issue: GitHub.