Review Reason Fact Check - #289
Conversation
A recommendation's Reason was required to cite evidence, but nothing required the evidence to be true: the review on #270 justified a call with "Sonnet is the harness's standing default", and no file in the repository names Sonnet. The reviewer now re-checks every factual claim in every Reason against the file, search or issue text it names before posting; a claim that fails, or that the run's tools cannot check, is recast as the reviewer's judgement with the Recommendation kept, and never blocks posting. The pre-post self-check carries the clause, scoped to the re-framed gap on a refine run. RED: `git grep -i sonnet origin/main` exits 1 with no matches, so the posted #270 Reason was false; the prompt's quality bar (what a Reason contains) and self-check (that one exists) had no truth requirement. GREEN: the rule and its self-check clause are present in the prompt. No CI gate: the check runs over a comment composed at runtime, as with the rest of the self-check (CIR 2026-09-12-triageable-review-comment). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g3xHRn9ChW4mcjvduzB2U
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g3xHRn9ChW4mcjvduzB2U
- A claim found false is now dropped, not relabelled: a `my judgement` prefix never carries it. A claim the run cannot check may stay, but only inside a judgement Reason. - A harness-behaviour claim names no source, so it is checked by searching for where the behaviour would be set; finding nothing fails. - The quality bar, step 6 and the self-check no longer demand a cited Reason unconditionally, and the paragraph scopes a refine run to the re-framed gap. - "judgement call" no longer names every recommendation, so the label keeps one meaning. - CIR: pin the Sonnet claim to main at the time (this record now names it), cover harness claims in Behaviour, record the local-vs-workflow split for Reasons citing other issues, and drop a circular rejection. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g3xHRn9ChW4mcjvduzB2U
|
@claude Review this pull request. Analyse the code changes and provide feedback covering:
End the review with a recommendation whether to merge the PR, and if not, what you suggest needs addressing first. |
|
Claude finished @FrankRay78's task in 3m 39s —— View job Review complete
SummaryThis PR adds a fact-checking self-check to CorrectnessThe prompt edits are internally consistent:
Minor nit: line 231 ("...or, where there is nothing checkable to cite, says it is your judgement.") and the opening sentence of the very next paragraph, Every Reason survives being checked (line 233), state the same rule back to back. Not a bug, just a candidate for tightening given this document's own emphasis on brevity elsewhere. Fix this → SecurityNo security-relevant surface — this changes agent-prompt prose only, no executable code, no new shell invocations or permissions. CLAUDE.md / constitution adherence
Test coverageNone expected or needed: this is a natural-language prompt for an LLM, not testable via xUnit, and per the constitution's carve-out the RED/GREEN evidence is the real check ( Spec/test-plan mismatchesNone — this issue has no Environment note (not a PR defect)The checkout this review ran in has an uncommitted local modification to RecommendationMerge. The change is small, well-scoped, self-consistent across the three places it touches, and its own RED/GREEN evidence and cross-references check out under verification. Only the minor prose-redundancy nit above is worth a follow-up touch-up, and it doesn't block merging. |
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016g3xHRn9ChW4mcjvduzB2U
The Recommendation quality bar paragraph ended with "or, where there is
nothing checkable to cite, says it is your judgement", which restates the
opening of the paragraph immediately below it ("Every Reason survives
being checked" — a Reason either cites something checkable or says
plainly that it is your judgement). Drop the clause; the following
paragraph states the rule in full, with the label format.
Prompt-text change only — no production code, no behaviour change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R6WN7kXkjwEZ2PhsuGJBa5
|
Pushed The Recommendation quality bar paragraph ended with "— or, where there is nothing checkable to cite, says it is your judgement", which restates the opening of Every Reason survives being checked directly below it. That paragraph states the rule in full, including the @claude please review the last commit ( Generated by Claude Code |
|
Claude finished @FrankRay78's task in 1m 21s —— View job Reviewing commit
|
Why
Every
/speckit.reviewissuegap ends with a recommendation and a one-sentence Reason, and nothing checked that the Reason was true. The review on #270 justified a call with "Sonnet is the harness's standing default", and no file onmainnames Sonnet. Since #281 made reviews short enough to accept from the table, a false Reason can quietly settle a real decision.What changes
my judgement — <why>without it. A claim the run can't check may stay, but only inside a judgement Reason. The Recommendation always stays, and a failed check never blocks posting.Non-obvious things a reviewer should know
/verifyreview caught it, and the rule now drops the claim.speckit-reviewissue.ymlapplies this prompt as written, so it's covered with no workflow change. But its tools can't read other issues (nogh issue view), so a true Reason citing another issue posts as judgement from the workflow and as evidence from a local run. AllowingBash(gh issue view:*)would close that gap, but it widens the workflow's permissions and wasn't in Check that a /speckit.reviewissue recommendation's Reason holds up against what it cites #287's scope, so it's left for a separate decision.Related
Closes #287
2026-09-12-review-reasons-survive-checking.🤖 Generated with Claude Code
https://claude.ai/code/session_016g3xHRn9ChW4mcjvduzB2U