Redundant Self-Critique is an AI code smell, a sign of trouble in LLM systems, in the Dispensables group. A review your answer step that doubles the cost and almost never changes anything.
A PR reviewer generates comments and, before posting, runs three rounds of “review your review”. The code (anonymized):
review = llm(REVIEW_PROMPT, diff)for _ in range(3): review = llm("Critically review the review below and improve it.", review)post_comments(review)
A month of traces showed that on 94 of every 100 PRs, the third version had the same comments as the first, in slightly different words. On the other 6, the change was stylistic. The review cost four times as much as the first call.
Suppose, just to see the count, 2,000 tokens in generation and 2,000 in each review. Four calls send about 8,000 input tokens in this step alone, to return the comment the first call already had. Latency follows: four round trips on the critical path.
Signs of Redundant Self-Critique:
There is a “review”, “critique”, or “improve” step that runs over its own output, with no new information.
The review step uses the same model, the same context, and no verifiable criterion.
Comparing the review’s input and output, almost nothing changes.
The eval gives the same result with and without the step.
The step doubles or triples cost and latency.
flowchart LR
G(["1. Generate"]):::llm --> R1(["2. Review"]):::llm
R1 --> R2(["2. Review again"]):::llm
R2 --> R3(["2. Review once more"]):::llm
R3 --> OUT(["3. Nearly the same output, 4x the cost"]):::io
The model generates the answer.
The same model rereads its own answer, with no new data, and rewrites it.
The final output is essentially the first one.
Human intuition (“reread before you send”) does not transfer. A person who rereads brings memory, fatigue, a pattern they just saw in the next file. The model rereads the same buffer.
Reasons
“Think again” always sounds good. Reviewing is a solid human habit. Copied into the pipeline, it becomes an extra call with the same input.
Papers that show gains from reflection. Reflexion (Shinn et al., 2023) uses an external signal (the environment, a test). Self-Refine (Madaan et al., 2023) also structures the feedback. The naive copy drops the signal and keeps only “improve the text above”.
No eval. Nobody measured whether the step changes anything. Four times the cost looks like “more quality”.
It feels safer. One more “assurance” step brings comfort, even with no effect. On a compliance team, nobody wants to be the person who removed the review.
Cost of ignoring
Multiplied cost and latency with no quality gain. On the reviewer, every PR waits for four calls.
Sometimes it hurts. A review with no criterion can “improve” something that was right: it softens “this breaks production” into “might be worth a look”.
A false sense of control. The team believes there is a quality check that does not exist. The incident walks through all three rounds and nobody distrusts the step.
Anthropic’s “Building effective agents” (Dec. 2024) describes the Evaluator-Optimizer pattern with a separate evaluator and a rubric. That is the opposite of this smell: there are criteria, independence, and, when it pays, a measured gain.
The eval shows the step does not change the result. It goes, and whatever was useful in it (a criterion, a format) moves into the main step’s prompt. Target: Prompt Chaining.
If review is needed, give it new information: an external signal (Reflection) or a separate evaluator with a rubric (Evaluator-Optimizer).
Before you delete, measure. Run the eval with and without the step, on the same seed, on the same set. If the score does not move, the step goes. If it moves a little and the cost doubles, the tradeoff needs to be explicit, not a habit.
The diff the team is waiting for, in practice:
review = llm(REVIEW_PROMPT, diff)post_comments(review)# length checks and "file not in the diff" live in code, not in a second call
Three fewer lines on the critical path. If one day the eval asks for the round back, it comes back with a rubric or a test, not with “improve the text”.
Objective checks (length, schema, “the SQL runs”, “the quote exists in the PDF”) belong in code. They should not ask for a fourth model call.
Payoff
Cost and latency proportional to the real work.
A shorter pipeline that is easier to debug.
When there is review, it has a criterion you can measure.
When to ignore
The eval shows a gain. If the step improves quality measurably, it is not redundant, even without an external signal. Keep it and monitor it.
Long reasoning tasks. On some hard problems, a second pass does find errors. Measure before deciding.
Is it this smell?
Quick answers
What is Redundant Self-Critique?
Redundant Self-Critique is an AI code smell, a sign of trouble in LLM systems, in the Dispensables group. A review your answer step that doubles the cost and almost never changes anything.
How do you fix Redundant Self-Critique?
With Inline Trivial Step. Each refactoring has safe step-by-step mechanics with an eval before and after.
Where does Redundant Self-Critique show up in practice?