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
- Retry with refreshed file line numbers in context
- Validate the range ordering before sending to the model and ask for corrections
- 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
- Validate range ordering and bounds before slicing the file
- Re-sync line numbers after every applied change
- Fall back to whole-file builds when ranges repeatedly fail
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
- invalid line number for first line: %d
- old content does not have a line number prefix for first lin
- error extracting line number from first line: %v
- error extracting line number from last line: %v
- start line is greater than end line: %d > %d
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/0da05c3480bda405.
Report an issue: GitHub.