Aider-AI/aider · error · ValueError
{processed}\n^^^ {err}
Error message
{processed}\n^^^ {err} What it means
This is the wrapper re-raise at the end of the generator's except ValueError block: any of the inner parse errors (missing filename, Expected =======, Expected >>>>>>> REPLACE) is re-raised with the full text processed so far prepended and a '^^^ <original error>' suffix pointing at the offending spot. It exists purely to add line context to SEARCH/REPLACE grammar errors.
Source
Thrown at aider/coders/editblock_coder.py:533
while i < len(lines) and not (
updated_pattern.match(lines[i].strip())
or divider_pattern.match(lines[i].strip())
):
updated_text.append(lines[i])
i += 1
if i >= len(lines) or not (
updated_pattern.match(lines[i].strip())
or divider_pattern.match(lines[i].strip())
):
raise ValueError(f"Expected `{UPDATED_ERR}` or `{DIVIDER_ERR}`")
yield filename, "".join(original_text), "".join(updated_text)
except ValueError as e:
processed = "".join(lines[: i + 1])
err = e.args[0]
raise ValueError(f"{processed}\n^^^ {err}")
i += 1
def find_filename(lines, fence, valid_fnames):
"""
Deepseek Coder v2 has been doing this:
```python
word_count.py
```
```python
<<<<<<< SEARCH
...
This is a more flexible search back for filenames.
"""View on GitHub (pinned to 5dc9490bb3)
Solutions
- Read bottom-up: the text after '^^^' names the actual grammar problem; the text above it shows the input up to the failing line.
- Fix the indicated block per the underlying error (filename line, =======, or >>>>>>> REPLACE).
- Feed the whole message back to the LLM for a corrected reply.
- Add regression tests capturing the offending reply shape when it recurs (aider's tests do exactly this with recorded transcripts).
Defensive patterns
Strategy: try-catch
Try / catch
try:
edits = list(parse_edits_or_raise(reply))
except ValueError as e:
msg = str(e)
underlying = msg.split("^^^ ")[-1] # the real grammar error
context = msg.split("^^^ ")[0] # processed input up to the failure
log_and_retry_with_model(underlying, context) Prevention
- Always split on '^^^ ' when logging this error — the suffix names the root cause, the prefix shows where.
- Keep recorded transcripts of failing replies as regression fixtures.
- Don't string-match the whole message; match the suffix (filename/divider errors) for routing logic.
When it happens
Trigger: Any of errors 3-5 firing inside the try block while parsing a fenced SEARCH/REPLACE block; the handler joins lines[:i+1] (everything consumed including the failing line) and re-raises with the '^' pointer.
Common situations: Debugging where exactly in an LLM reply the SEARCH/REPLACE grammar broke — the processed prefix shows the malformed block verbatim; commonly seen in logs when models produce structurally invalid edit blocks.
Related errors
- Bad/missing filename. The filename must be alone on the line
- Expected `=======`
- Expected `>>>>>>> REPLACE` or `=======`
- Error parsing patch content: {e}
- # {len(failed)} SEARCH/REPLACE {blocks} failed to match!\n
AI-assisted analysis of Aider-AI/aider@5dc9490bb3 (2026-08-15).
Data as JSON: /api/errors/855e94de35f59158.
Report an issue: GitHub.