Measured end-to-end on a real 13-MR backlog: the legacy advisor published one review. Five MRs were paid for. The other four paid reviews were discarded after the model had already run, and every failure posted a note that reads like a review.
This is the blunt cause behind the epic's 0 dispositions out of 937, and it sits upstream of the two causes carded so far (invisible finding ids, non-convergent --dispositions).
You cannot disposition findings that were never published.
Manual trigger, systemctl --user start corpus-gitlab-advisor-recovery.service, 2026-08-08 11:12–12:08Z:
tick done — 17 repo(s), 13 MR(s), 1 reviewed, 0 skipped, 0 empty,
10 stale, 2 failed, 0 capped, 3 notes posted, $0.4923 spent today
State after save: 5 accounted attempts, 3 entries (!23 published; !19 and !24 completed, so they retry under MAX_PAID_ATTEMPTS_PER_DIFF = 3). doering.ai !62 and corpus !158 were paid but got no entry at all.
| # | outcome | MRs | paid | carded |
|---|---|---|---|---|
| 1 | stale — no matching merge_request_event pipeline at head | wikiparse !28 !26 !22 !21 !17 | no | MEMY-1144 |
| 2 | stale — branch moved during the review | doering.ai !62, corpus !158 | yes | here |
| 3 | indeterminate — reconcile parse_error | wikiparse !24 | yes | here |
| 4 | indeterminate — quorum unmet (transient provider cooldown) | wikiparse !19 | yes | here |
| 5 | diff-refs-invalid — refs failed the 40-hex check | wikiparse !18 !14 | no | here |
Mode 2 loses the review, and — corrected — does not run up an unbounded bill. A first draft of this card claimed it "bills forever"; that was inferred from the absence of a state entry, on a single observed dispatch each, and it overstated the evidence. Reading the attempt receipts settles it:
doering.ai/62 attempt phase=returned accounted $0.003788 — no *.review.json, no *.report.json
libs/corpus/158 attempt phase=returned accounted $0.007877 — no *.review.json, no *.report.json
So the cost was recorded (the spend cap and the attempt ceiling both see it), but no replayable record was written — the review content itself is gone. What that means concretely:
MAX_PAID_ATTEMPTS_PER_DIFF = 3 conclusive attempts, then it gives up.I observed one dispatch each, not a repeat. The re-dispatch is certain (no replayable record exists); whether it re-pays depends on whether the head moved again. Stated as measured, not as projected.
Mode 3 is a merge-only stage failing the whole review. advisor.py:434 does obj = raw if isinstance(raw, dict) else _extract_json(raw) — JSON scraped out of the reconcile model's prose.
Miss it, and finish_reason='parse_error' forces unreviewed and discards three successful lens calls.
Mode 4 is infrastructural, not model quality. Two of three lenses hit RateLimitError: No deployments available for selected model (a LiteLLM cooldown); the 2-of-3 quorum then discarded the lens that had succeeded.
A direct probe of the same alias seconds later returned OK in 5.8 s. num_retries: 0 on this route is deliberate — the worker owns replay — so a momentary hiccup costs the review outright.
Every failure above still posts:
advisor review — unreviewed (status: failed)
From the MR page that is indistinguishable from a review that ran and found nothing.
This is the MEMY-799 signature recurring — a green svcstat showed all four advisor units healthy throughout.
Reviews are not expensive (!23: 2 critical / 6 major / 19 minor, 28 threads, $0.0101); the failures are what cost.
corpus/critic/ + corpus/gitlab_critic/ are slated for retirement in APPS-93 W7, and the successor removes modes 3 and 4 by construction (typed submit_findings tool call, no JSON mined from prose; no lens quorum).
State the rate with its denominator — the two available numbers mean different things and only one of them is about the reviewer:
| denominator | rate | what it measures |
|---|---|---|
| per paid dispatch (1 of 5) | 20% | the reviewer's own reliability — modes 2, 3, 4 |
| per MR found (1 of 13) | 8% | end-to-end fleet experience, including MRs the reviewer never saw |
The 8% figure charges the reviewer for seven MRs it was never given (five refused for want of a CI pipeline, two for malformed diff refs). It is the honest number for "what does an agent waiting on a review actually get", and the wrong number for "how good is the reviewer". Quote both or neither.
So the question is not "fix these five" but how long the fleet runs at a 20% per-dispatch publish rate. Either accelerate W7, or fix mode 4 (a transient cooldown should not discard successful lens work) and mode 3 (a merge-only stage should not be able to fail the whole review) — those are the two that waste a completed review. Mode 2 wastes cents, not dollars; it is a correctness annoyance, not a spend problem.
Cheapest independent win, and it is not a rewrite: stop posting an unreviewed note. Silence is more honest than a note that reads like a review.
A run that publishes no findings does not post a note that reads like a completed review.
Mode 2 either writes state or is bounded, so a hot branch cannot be re-paid indefinitely.
A transient provider cooldown does not discard successful lens work (retry the failed lens, or lower the quorum when the failure is a provider error rather than a verdict).
Re-measure publish rate on a real backlog; record it as a number, not an impression.