{"record":{"id":"f21a1b320a53ddc9","repo":"plandex-ai/plandex","slug":"error-extracting-line-number-from-last-line-v","errorCode":null,"errorMessage":"error extracting line number from last line: %v","messagePattern":"error extracting line number from last line: (.+?)","errorType":"validation","errorClass":null,"httpStatus":500,"severity":"error","filePath":"app/server/model/plan/build_validate_and_fix.go","lineNumber":413,"sourceCode":"\n\t\tvar lastLine string\n\t\tvar lastLineNum int\n\t\tfirstLine := oldLines[0]\n\t\tif len(oldLines) > 1 {\n\t\t\tlastLine = oldLines[len(oldLines)-1]\n\t\t}\n\n\t\tfirstLineNum, err := shared.ExtractLineNumberWithPrefix(firstLine, \"pdx-\")\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Error extracting line number from first line: %v\", err)\n\t\t\treturn buildValidateResult{valid: false, updated: updated}, fmt.Errorf(\"error extracting line number from first line: %v\", err)\n\t\t}\n\n\t\tif lastLine != \"\" {\n\t\t\tlastLineNum, err = shared.ExtractLineNumberWithPrefix(lastLine, \"pdx-\")\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"Error extracting line number from last line: %v\", err)\n\t\t\t\treturn buildValidateResult{valid: false, updated: updated}, fmt.Errorf(\"error extracting line number from last line: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\tif lastLineNum == 0 {\n\t\t\tif !(firstLineNum > 0 && firstLineNum <= len(originalFileLines)) {\n\t\t\t\tlog.Printf(\"Invalid line number for first line: %d\", firstLineNum)\n\t\t\t\treturn buildValidateResult{valid: false, updated: updated}, fmt.Errorf(\"invalid line number for first line: %d\", firstLineNum)\n\t\t\t}\n\t\t\told = originalFileLines[firstLineNum-1]\n\t\t} else {\n\t\t\tif !(firstLineNum > 0 && firstLineNum <= len(originalFileLines) && lastLineNum > firstLineNum && lastLineNum <= len(originalFileLines)) {\n\t\t\t\tlog.Printf(\"Invalid line numbers for first and last lines: %d-%d\", firstLineNum, lastLineNum)\n\t\t\t\treturn buildValidateResult{valid: false, updated: updated}, fmt.Errorf(\"invalid line numbers: %d-%d\", firstLineNum, lastLineNum)\n\t\t\t}\n\t\t\told = strings.Join(originalFileLines[firstLineNum-1:lastLineNum], \"\\n\")\n\t\t}\n\n\t\t// log.Printf(\"Applying replacement.\\n\\nOld:\\n\\n%s\\n\\nNew:\\n\\n%s\", old, new)","sourceCodeStart":395,"sourceCodeEnd":431,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/model/plan/build_validate_and_fix.go#L395-L431","documentation":"When the old block spans multiple lines, the last line must also carry a valid 'pdx-<num>' prefix to delimit the replacement range. This error is returned when ExtractLineNumberWithPrefix fails on the last line.","triggerScenarios":"Multi-line old block whose last line lacks a parseable line number after a valid 'pdx-' prefix (or no prefix at all on the last line).","commonSituations":"Model correctly prefixes the first line but forgets the last, or the last line is a partial/duplicated hunk.","solutions":["Retry so the model regenerates the range with both endpoints prefixed","Strengthen the prompt to require 'pdx-N' on both first and last lines","Add a response pre-check that rejects ranges missing the last-line prefix before reaching this code"],"exampleFix":"// before\nold = \"pdx-10 func main() {\\n}\\\"  // last line unprefixed\n// after\nold = \"pdx-10 func main() {\\npdx-12 }\\\"","handlingStrategy":"validation","validationCode":"lines := strings.Split(old, \"\\n\")\nif len(lines) > 1 {\n    if _, err := shared.ExtractLineNumberWithPrefix(lines[len(lines)-1], \"pdx-\"); err != nil {\n        return fmt.Errorf(\"last line of old block missing valid pdx- prefix\")\n    }\n}","typeGuard":"func validRangeBlock(old string) bool {\n    lines := strings.Split(old, \"\\n\")\n    if len(lines) < 2 { return true }\n    _, err := shared.ExtractLineNumberWithPrefix(lines[len(lines)-1], \"pdx-\")\n    return err == nil\n}","tryCatchPattern":null,"preventionTips":["Require both range endpoints to carry pdx- prefixes","Prompt the model explicitly about last-line prefixes","Pre-check ranges before applying replacements"],"tags":["go","parsing","llm-output","line-numbers"],"backgroundTag":"line-number-parse-failed","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}