Skip to content

fix: keep the reviewer's objection, not its praise - #169

Merged
thedancingdeveloper merged 1 commit into
mainfrom
fix/keep-the-reason-not-the-preamble
Aug 5, 2026
Merged

fix: keep the reviewer's objection, not its praise#169
thedancingdeveloper merged 1 commit into
mainfrom
fix/keep-the-reason-not-the-preamble

Conversation

@thedancingdeveloper

Copy link
Copy Markdown
Contributor

last_error is what a retry is told and what an operator reads. It kept the
first 500 characters of the verdict — and the rubric asks for "what I
verified" first and "why" last, so those 500 characters were the list of things
the reviewer was happy with. The objection was cut off.

Measured

Two items rejected twice for the same fault. Both retries were told,
faithfully, only the preamble:

R3: 517 chars, ending "...er still gets the original API shape.\n- The support bundle p"
R4: 517 chars, ending "...visual pattern.\n\n2. **What I could not verify** — The diff d"

Neither reached section 3, "Why". This is why #166 looked ineffective: the
feedback channel worked exactly as built and carried the wrong half of the
message.

The fix

Keep the tail, cut at a section boundary so a retry is not handed half a
sentence about something it cannot see the start of. Short verdicts are kept
whole. Both executors truncated identically and now share one helper, so it
cannot drift the way the review rubric did (#167).

Note on the diagnosis

I had attributed one of those repeats to a contradictory brief of my own —
which was real and is fixed separately. It was not the only cause. The agent
also never saw the objection, in either item. Two independent faults, one
symptom, and I would have stopped at the first if the second had not still
been reproducing.

All four gates green.

🤖 Generated with Claude Code

`last_error` is what a retry is told and what an operator reads. It kept the
first 500 characters of the verdict — and the rubric asks for "what I
verified" first and "why" last, so those 500 characters were the list of
things the reviewer was *happy* with. The objection, the only part anyone can
act on, was cut off.

Measured. Two items were rejected twice for the same fault, and both retries
had been told, faithfully, only the preamble praising the parts that were
fine:

  R3: 517 chars, ending "...er still gets the original API shape.\n- The
      support bundle p"
  R4: 517 chars, ending "...visual pattern.\n\n2. **What I could not verify**
      — The diff d"

Neither reached section 3. This is why #166 looked ineffective: the feedback
channel worked and carried the wrong half.

So the tail wins when something has to go, cut at a section boundary so a
retry is not handed half a sentence about something it cannot see the start
of. The head is a summary of a diff the reader already has; the tail is the
decision.

Both executors truncated identically and both now share one helper, so this
cannot drift the way the review rubric did (#167).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@thedancingdeveloper
thedancingdeveloper merged commit b73f967 into main Aug 5, 2026
2 checks passed
@thedancingdeveloper

Copy link
Copy Markdown
Contributor Author

Already fixed. review_reason() in executor.py keeps the verdict's tail rather than its first 500 characters, cutting at a section boundary so a retry is not handed half a sentence:

The rubric asks for 'what I verified' first and 'why' last, so those 500 characters were the list of things the reviewer was happy with, and the objection — the only part anyone can act on — was cut off.

Both modes call it, since #167 made them share one reviewer path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant