Skip to content

fix(claude-code-review): retry once when a review completes with no verdict - #201

Merged
d-morrison merged 3 commits into
mainfrom
claude/github-issue-185-y0qerh
Jul 3, 2026
Merged

fix(claude-code-review): retry once when a review completes with no verdict#201
d-morrison merged 3 commits into
mainfrom
claude/github-issue-185-y0qerh

Conversation

@d-morrison

Copy link
Copy Markdown
Collaborator

Closes #185.

Root cause status

#187 (merged) addressed #185's original signature by telling the reviewer up
front that a denied tool call is never a reason to stop early. That reduced
but didn't eliminate it: a fresh reproduction on Lacaedemon/sparta PR #613
— well after #187 was merged and active — showed the same low-denial
fingerprint (is_error: false, permission_denials_count: 1, no
### Verdict), just with a different turn count (7 vs. the original 4). The
issue was reopened with that evidence.

Rather than chase a third prompt-wording tweak against a fundamentally
probabilistic failure mode, this PR adds a structural mitigation: detect the
exact retryable signature and automatically retry once, plus make any future
recurrence actually diagnosable (the original report noted "the exact denied
tool call isn't visible in the log" — show_full_output was off and the
transcript was never persisted anywhere).

Not in scope: #198 tracks a different, much-higher-denial-count stub
signature (17-35 denials vs. #185's 1) that has NOT recovered on retry in its
own investigation and is explicitly paused pending a full transcript capture.
This PR's retry is gated tightly on the stub_review signal (real non-empty
text, no SDK error, no verdict, distinguishing it from a hard error or empty
output) so it won't fire — or spend extra API cost — on #198's pattern.

What changed

  • check-review-execution.sh now writes stub_review=true to
    $GITHUB_OUTPUT specifically for the "real text, no SDK error, no verdict"
    case, distinct from a hard error or genuinely empty output.
  • run-review-guard passes that output through.
  • New composite action run-claude-review-attempt wraps the single
    anthropics/claude-code-action call (allowedTools/disallowedTools, review
    prompt) so claude-code-review.yml can invoke it a second time, unchanged,
    as a same-prompt retry — without duplicating that ~100-line step (a DRY
    violation this repo's own CLAUDE.md flags). The retry attempt gets one
    extra instruction: this is a retry, and it must end with a verdict
    regardless of what gets denied along the way.
  • claude-code-review.yml: attempt 1 → guard (now continue-on-error)
    → retry only if stub_review fired → guard again → "Resolve final review
    outcome" picks whichever attempt succeeded and is the only step that
    genuinely fails the job when neither did.
  • Execution output artifact. Both attempts now upload their raw
    execution-output JSON as a workflow artifact
    (claude-review-execution-<run>-<attempt>-attempt{1,2}), so a future
    stub/failure has a downloadable turn-by-turn transcript without needing
    show-full-output pre-enabled.

Testing

  • bash .github/workflows/scripts/tests/run-fixture-tests.sh — extended with
    a fail-stub expectation (fail + stub_review=true) for the four existing
    stub fixtures, keeping is-error-result.json/empty-review-text.json as
    plain fail (not retried). All 10 fixtures pass.
  • bash .github/actions/parse-workflow-ref/tests/run-tests.sh — unaffected, still passes.
  • _selftest.yml's review-fail-check job gets a second real
    uses: ./.github/actions/run-review-guard step against a stub fixture,
    asserting stub_review comes back true end-to-end (mirroring the
    existing genuine-finished-review.json coverage) — this is what would
    have caught a passthrough-wiring bug that a script-only unit test can't see
    (the same class of gap Fix claude-code-review guard script path for consumer repos #191/check-review-execution.sh path-resolution regressed: parse-workflow-ref runs twice, second call omits workflow-ref input #196 taught).
  • All workflow/action YAML validated with yaml.safe_load.
  • run-claude-review-attempt itself has no offline test coverage — it wraps
    a live anthropics/claude-code-action call, which isn't something a
    selftest job can exercise (same as the inline step it replaced).

Changelog

Added changelog.d/review-retry-stub-verdict.fixed.md per this repo's
fragment convention.


Generated by Claude Code


Generated by Claude Code

…erdict

Reopened #185 after a fresh reproduction post-#187: the low-denial
stub-review signature (is_error:false, permission_denials_count:1, no
verdict) still recurs even with #187's "don't stop on a denied tool call"
system-prompt fix in place.

check-review-execution.sh now surfaces this specific, retryable case (real
non-empty text, no SDK error, no verdict) as a stub_review output, distinct
from a hard SDK error or genuinely empty output. claude-code-review.yml
retries the same review prompt once when it fires, with an added instruction
that the retry must end with a verdict regardless of what gets denied along
the way, before failing the check for real.

The anthropics/claude-code-action call moved into a new
run-claude-review-attempt composite action so the retry doesn't duplicate
that ~100-line step. The raw execution output is now also uploaded as a
workflow artifact on every attempt, so a future recurrence has a
downloadable transcript to diagnose instead of needing show-full-output
pre-enabled and a lucky re-trigger.

Closes #185.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas
Copilot AI review requested due to automatic review settings July 3, 2026 05:09
@github-actions
github-actions Bot removed the request for review from Copilot July 3, 2026 05:09

Copy link
Copy Markdown
Collaborator Author

/review

(Re-triggering: the automatic review hit the exact bug this PR fixes — permission_denials_count: 1, is_error: false, no verdict — on the pre-merge @v2 version of claude-code-review.yml. Re-running the failed job via the Actions API 403'd for this session, so re-requesting via /review instead.)


Generated by Claude Code

@claude

claude Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Code review

I reviewed the diff for PR #201 (retry-once-on-stub-verdict logic for claude-code-review.yml). Inline PR-comment tooling isn't available to me in this environment, so findings are grouped below with path:line anchors (against HEAD f9406f3).

Findings

1. The stub_review retry does NOT actually exclude gha#198's pattern, contradicting the PR's own stated design goal — CONFIRMED
.github/workflows/claude-code-review.yml:628-637 (new retry step's header comment) and the PR description both claim: "a run stubbing for OTHER reasons (e.g. gha#198's much-higher-denial-count signature) is also excluded by the stub_review check, since that one has repeatedly NOT recovered on retry per #198's own findings."

That's not what the code does. stub_review=true is set in .github/workflows/scripts/check-review-execution.sh:100-105 purely from "is_error==false, non-empty assistant text, no verdict line" — there is no check anywhere in the script (or in the retry step's if: at claude-code-review.yml:644-647) on permission_denials_count or num_turns. I pulled the live issues to confirm:

  • gha#185 (this PR's target): is_error:false, real non-empty text, no verdict, permission_denials_count: 1.
  • gha#198 (open, unresolved, explicitly "paused pending a full transcript capture" per its own thread — and its latest comment reports the pattern got worse, not better, across three different allowlist-patch attempts): is_error:false, real non-empty text, no verdict, permission_denials_count: 17-35.

These are the same textual shape by every signal check-review-execution.sh inspects — the two issues are only distinguished by denial count, which the guard never looks at. So the retry will fire on gha#198-shaped failures too, doubling API cost (gha#198's own data shows total_cost_usd of ~$2-4 per attempt) on a pattern gha#198 already shows does not reliably recover, and that this PR explicitly says it's designed to avoid retrying.

Either add an actual exclusion (e.g. a permission_denials_count threshold, if that's really a reliable discriminator) or correct the comment/PR description — as written, both describe behavior the code doesn't implement.

2. resolve-final's failure message misattributes the retry's actual failure mode — PLAUSIBLE
.github/workflows/claude-code-review.yml:719-722 (new Resolve final review outcome step): when neither attempt succeeds, the "both ended without a verdict" error message is chosen based solely on steps.fail-check.outputs.stub_review (attempt 1's flag) — it never checks whether the retry (fail-check-retry) also stubbed vs. failed for a different reason (hard SDK error, empty text, quota exhaustion mid-retry). If the retry fails differently than attempt 1 did, the job log will still claim "gha#185's stub-review signature" happened twice, which undercuts this PR's own diagnosability goal (the reason it also added the execution-output artifact upload). Minor relative to finding 1, but worth a quick fix (check steps.fail-check-retry.outputs.stub_review too) since it's cheap to get right.

Other notes (no issues)

  • The extraction of the claude-code-action call into run-claude-review-attempt (composite action) to avoid duplicating the ~100-line with: block across two steps is a good, idiomatic DRY fix per this repo's own CLAUDE.md review priorities.
  • Traced the continue-on-error/implicit-success() interactions across the new attempt-1 → retry → resolve-final step chain by hand; the gating is correct (retry only fires when attempt 1 stubs specifically, resolve-final correctly fails the job when neither attempt produces a usable review, and the require-review/quota_exhausted job-output plumbing through resolve-final preserves the original semantics).
  • actions/upload-artifact@043fb46...# v7.0.1 pin matches the identical pin already used in test-coverage/action.yml, preview/action.yml, and .github/workflows/quarto-publish.yml — not a fabricated version.
  • Fixture reclassification (failfail-stub) in run-fixture-tests.sh and the new _selftest.yml end-to-end stub_review assertion are correctly wired and consistent with the four existing stub fixtures.
  • CLAUDE.md doc updates (Layout section, review-fail-check description) accurately describe the new composite action and the two-attempt flow; I didn't find any other @v1/@v2 or workflow-input doc-sync gaps this PR should have touched (no new workflow_call input was added, so README.md/website/reference table updates aren't required here).
  • Per this repo's own documented gotcha: since claude-review.yml calls claude-code-review.yml@v2 (not a local ref), this PR's own retry logic won't actually run against real dogfooding reviews of this PR until merged and the @v2 tag slides forward — expected/consistent with how prior new composites (e.g. run-review-guard) were rolled out, not a defect in this PR.

ℹ️ This review ran in a sandboxed environment with no inline-comment tool and no outbound network access (couldn't verify anything requiring a live fetch beyond what gh read-only calls and the local checkout provided); the two GitHub issues cited above were read directly via gh issue view to confirm the denial-count claim.

Verdict

Needs more work — finding 1 is a confirmed mismatch between the code's actual behavior and this PR's explicit, stated design goal (avoiding retries on gha#198's pattern), with a real cost impact on an issue that's open and actively recurring in this very repo. Finding 2 is a minor, cheap-to-fix diagnosability nit. Everything else in the diff (the composite-action extraction, the fixture/selftest wiring, the CLAUDE.md doc sync) looks correct and idiomatic.

…eshold

Review finding on #201: the retry's header comment and PR description
claimed gha#198's high-denial-count no-verdict pattern was excluded from
the retry, but check-review-execution.sh never actually checked
permission_denials_count — stub_review fired purely on "no verdict",
which is textually identical between #185 (denials: 1) and #198
(denials: 17-35). Add an actual permission_denials_count <=
STUB_RETRY_MAX_DENIALS (default 5) gate, a fixture modeling #198's
pattern expecting plain `fail` (not `fail-stub`), and correct every
comment that claimed the exclusion without implementing it.

Also fixes a second finding: "Resolve final review outcome"'s failure
message always attributed a double-failure to attempt 1's stub_review
flag, even when the retry failed for a different reason. It now inspects
which attempt actually ran and why.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas
Copilot AI review requested due to automatic review settings July 3, 2026 05:27

Copy link
Copy Markdown
Collaborator Author

Both findings addressed in 56e612a:

Finding 1 (confirmed bug)check-review-execution.sh now actually gates stub_review=true on permission_denials_count <= STUB_RETRY_MAX_DENIALS (default 5), not just "no verdict." Added a new fixture (stub-gha198-high-denial-count.json, denials: 20) that asserts plain fail, not fail-stub — this would have caught the original bug. Corrected every comment (in claude-code-review.yml, the changelog fragment) that claimed the exclusion without the code implementing it.

Finding 2resolve-final's error message now inspects which attempt actually ran and why (retry ran and stubbed again vs. retry failed differently vs. retry never completed vs. attempt 1 wasn't eligible), instead of always attributing a double-failure to attempt 1's stub_review flag.

All 11 fixtures (10 existing + the new one) pass locally.


Generated by Claude Code

@github-actions
github-actions Bot removed the request for review from Copilot July 3, 2026 05:28
Comment on lines +519 to +542
- name: Resolve execution file path (retry)
id: exec-file-retry
if: steps.claude-review-retry.outcome == 'success'
continue-on-error: true
shell: bash
env:
EXECUTION_FILE: ${{ steps.claude-review-retry.outputs.execution_file }}
run: |
set -euo pipefail
if [[ -z "$EXECUTION_FILE" ]]; then
EXECUTION_FILE="${RUNNER_TEMP:-/home/runner/work/_temp}/claude-execution-output.json"
echo "::warning::execution_file output not set; falling back to $EXECUTION_FILE"
fi
echo "path=$EXECUTION_FILE" >> "$GITHUB_OUTPUT"

- name: Upload review execution output (retry)
if: steps.exec-file-retry.outcome == 'success'
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: claude-review-execution-${{ github.run_id }}-${{ github.run_attempt }}-attempt2
path: ${{ steps.exec-file-retry.outputs.path }}
retention-days: 14
if-no-files-found: warn

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor DRY nit (non-blocking): the "Resolve execution file path (retry)"/"Upload review execution output (retry)" steps here duplicate the "Resolve execution file path"/"Upload review execution output" steps at L436-465 — same fallback-path shell logic and the same upload-artifact step shape, differing only in which steps.* outputs they read and the artifact name suffix (attempt1/attempt2).

This is the same category of duplication this PR's own run-claude-review-attempt extraction was built to avoid (per this repo's CLAUDE.md review priorities: "Flag duplicated logic (DRY)... factor shared logic into reusable units rather than copying it between files"). It's much smaller here (~15 lines vs. the ~100-line with: block), so not a blocker, but worth considering folding the resolve+upload pair into a small composite action (or a loop/matrix over attempt1/attempt2) alongside run-claude-review-attempt, for the same reason this PR gave for extracting that one.

Not a functional bug — just flagging for consistency with the PR's own stated DRY rationale.

@claude

claude Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Code review (re-review after follow-up fix)

I re-reviewed PR #201 after the follow-up commit 56e612a addressed the two findings from my prior review (posted 2026-07-03T05:25:18Z). Verified independently (including via two dedicated sub-review passes — one bug-hunt, one CLAUDE.md-compliance) against the current code, not just the commit message's claims.

Prior findings — both confirmed fixed

1. stub_review retry now genuinely excludes gha#198's pattern. check-review-execution.sh:113-130 now gates stub_review=true behind permission_denials_count <= STUB_RETRY_MAX_DENIALS (default 5), not just "no verdict." The new stub-gha198-high-denial-count.json fixture (permission_denials_count: 20) is correctly classified fail (not fail-stub) in run-fixture-tests.sh, while the four original stub fixtures (permission_denials_count: 0) remain fail-stub. The code now matches what the comments and changelog fragment claim.

2. resolve-final's failure message now attributes correctly. claude-code-review.yml's "Resolve final review outcome" step (~L558-596) now branches on steps.fail-check-retry.outcome/.outputs.stub_review to distinguish "retry also stubbed," "retry failed differently," "retry never completed," and "attempt 1 wasn't retry-eligible" — instead of always blaming attempt 1's flag regardless of what the retry actually did.

New finding (minor, non-blocking)

Posted inline: the "Resolve execution file path (retry)" / "Upload review execution output (retry)" steps duplicate their attempt-1 counterparts almost verbatim — the same category of duplication this PR's own run-claude-review-attempt composite extraction was built to avoid, per this repo's CLAUDE.md DRY guidance. Much smaller in scope than the block that motivated the extraction, so not a blocker.

Other notes (no issues)

  • Ran through the full continue-on-error/step-reference chain (fail-checkclaude-review-retryexec-file-retryupload artifact (retry)fail-check-retryresolve-final) by hand; no leftover references to pre-refactor step IDs, and quota_exhausted/review_text_file propagation is correct through both the clean and recovered-retry paths.
  • CLAUDE.md's own doc updates accurately describe the fixed code (including its own added note about gha#201 catching the earlier unimplemented-exclusion claim).
  • No new workflow_call input was added, so the README/website doc-sync rule doesn't apply here — confirmed by checking claude-code-review.yml's on.workflow_call.inputs block is unchanged.
  • The new fixture is plain execution-output JSON, correctly following the same bib/phi-scan exemption as the existing stub fixtures rather than the "generate fixtures at runtime" rule.

ℹ️ Network access for external verification is unavailable in this sandbox beyond gh's read-only calls and the local checkout, which was sufficient here since this round's fixes only touched code, fixtures, and docs already inspectable locally.

Verdict

Ready for merge — both previously-flagged issues are genuinely fixed, and the new finding is a minor, optional DRY suggestion rather than a defect.

…osite

Review nit on #201: the attempt-1 and retry "Resolve execution file
path"/"Upload review execution output" step pairs duplicated the same
fallback-path shell logic and upload-artifact shape almost verbatim -
the same class of duplication run-claude-review-attempt was extracted
to avoid, just smaller. Folded both into a new upload-review-execution
composite action.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas
Copilot AI review requested due to automatic review settings July 3, 2026 05:37

Copy link
Copy Markdown
Collaborator Author

DRY nit addressed in 6f2a65a — folded the "Resolve execution file path"/"Upload review execution output" pair (both attempt-1 and retry) into a new upload-review-execution composite action, same pattern as run-claude-review-attempt.

On the two failed checks (review / claude-review, review / require-review) at 56e612a: same known, expected limitation as the earlier failure on this PR — this repo's own claude-review.yml pins claude-code-review.yml@v2 (not a local ref), so dogfooding reviews of this PR run the pre-fix version until merge, and hit the exact bug being fixed here (confirmed: step name is still the old "Fail the check if the review did not complete", not the new "(attempt 1)" name). Not a defect in the diff — my push to 6f2a65a already triggers a fresh automatic review, so no manual re-trigger needed this time.


Generated by Claude Code

@github-actions
github-actions Bot removed the request for review from Copilot July 3, 2026 05:37
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Claude finished reviewView run


Code review (confirming review after DRY-nit fix)

I re-reviewed PR #201 after the newest commit 6f2a65a (the third commit on this PR, following f9406f3 and 56e612a, which my prior review posted at 2026-07-03T05:35:54Z had marked "Ready for merge"). That review still stands as the substantive verdict; this round confirms the one open minor nit from it is now resolved and finds nothing new.

Prior finding — resolved

The inline DRY nit about the duplicated "Resolve execution file path (retry)"/"Upload review execution output (retry)" steps is fixed: commit 6f2a65a extracts the resolve-plus-upload pair into a new .github/actions/upload-review-execution/ composite action, called once for attempt 1 (attempt-label: attempt1) and once for the retry (attempt-label: attempt2) in .github/workflows/claude-code-review.yml:441-508. I verified:

  • The composite's resolve/upload steps match the original inline logic exactly (temp-path fallback, claude-review-execution-<run>-<attempt>-<label> artifact naming, continue-on-error: true on the upload, retention-days: 14).
  • Both call sites (exec-file, exec-file-retry) wire execution-file and attempt-label correctly and the downstream steps.exec-file*.outputs.path references are unchanged.
  • CLAUDE.md's Layout section accurately documents the new action, citing this exact review (gha#201) as the reason for the extraction — I checked the described behavior against the actual composite file and it matches precisely.
  • No functional regressions: I traced the full claude-reviewexec-filefail-checkclaude-review-retryexec-file-retryfail-check-retryresolve-final chain in the current file and it's identical in behavior to what round 2 already verified, just with the two resolve/upload steps now delegating to the shared composite.
  • Fixture/script logic (check-review-execution.sh's STUB_RETRY_MAX_DENIALS gate, the stub-gha198-high-denial-count.json fixture, run-fixture-tests.sh's fail/fail-stub classification) is unchanged from the already-confirmed-fixed round-2 state.

No new issues found in this commit.

ℹ️ gh api calls were blocked pending approval in this sandbox; I worked around this using gh pr diff/gh pr view (which were available) plus this repo's own local checkout, which happens to already contain this PR's exact tree — sufficient to verify every claim above directly against the real files rather than the diff alone. The local working copy's CLAUDE.md had an unrelated uncommitted revert artifact (visible in git status/git diff) that does not reflect the PR's actual committed content (confirmed via git show HEAD:CLAUDE.md); this is local sandbox state, not a PR defect, and isn't included in the findings above.

Verdict

Ready for merge — the prior "Ready for merge" verdict stands; the only outstanding item (the minor DRY nit) is now fixed, and no new issues were introduced by this commit.

@d-morrison
d-morrison merged commit 79dd5c4 into main Jul 3, 2026
18 checks passed
@d-morrison
d-morrison deleted the claude/github-issue-185-y0qerh branch July 3, 2026 05:54
d-morrison pushed a commit that referenced this pull request Jul 3, 2026
Review finding on #205: the parenthetical implied #202's diff was
fixing the same stub-review bug #201 fixed, and that both PRs' reviews
were touching claude-code-review.yml right up until merge. Neither is
quite right: #202 fixed a different (related) allowlist gap and only
hit #185's stub-review signature as a bystander while it still edited
claude-code-review.yml directly, before a rebase onto #201 moved that
edit into the new run-claude-review-attempt composite action. Verified
the underlying fact via the actual failing run's execution output
(permission_denials_count:1, no verdict) rather than dropping the
citation outright.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas
d-morrison added a commit that referenced this pull request Jul 3, 2026
…-merge (#205)

* docs: note that fixes to claude-code-review.yml can't self-verify pre-merge

Learned across gha#201/#202: this repo's own claude-review.yml pins
claude-code-review.yml@v2 (the released tag), not a local ref, so a PR
fixing a bug in that file hits the pre-fix version on its own automatic
review until after merge. Both PRs saw their own claude-review check fail
with the exact signature they were fixing, right up until merge.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas

* fix(docs): correct overstated gha#202 citation in self-verify note

Review finding on #205: the parenthetical implied #202's diff was
fixing the same stub-review bug #201 fixed, and that both PRs' reviews
were touching claude-code-review.yml right up until merge. Neither is
quite right: #202 fixed a different (related) allowlist gap and only
hit #185's stub-review signature as a bystander while it still edited
claude-code-review.yml directly, before a rebase onto #201 moved that
edit into the new run-claude-review-attempt composite action. Verified
the underlying fact via the actual failing run's execution output
(permission_denials_count:1, no verdict) rather than dropping the
citation outright.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas

---------

Co-authored-by: Claude <noreply@anthropic.com>
d-morrison added a commit to Morrison-Lab/ai-config that referenced this pull request Jul 3, 2026
…m check (#431)

* ums: proactive sibling-PR resync after extraction, self-authored claim check

From Morrison-Lab/gha#201/#202 (2026-07-03):

- sync-with-main.md: extracting an inline block into a reusable unit (a
  composite action, a shared script) breaks the textual diff of any other
  open PR still editing that inline block. The mirror image of the
  already-documented case (there you resync your OWN branch after main
  moved a copy of your logic; here your OWN merge broke a sibling PR) --
  check for and proactively fix affected sibling PRs right after your
  extraction merges, rather than waiting for their author to hit the
  conflict.
- fact-check-prose.md: the existing "document-internal reasoning" checklist
  applies to your OWN PR descriptions/comments before posting, not just
  when reviewing someone else's prose -- a design-choice claim (a stated
  exclusion/handling of a specific case) is checkable against the code you
  just wrote. gha#201's PR claimed a retry mechanism excluded a known bad
  pattern via a flag that, on inspection, was never actually gated on the
  signal distinguishing that pattern -- caught by a claude[bot] review,
  avoidable by re-reading the claim against the actual `if` conditions
  before posting.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas

* ums: give a concrete git merge-tree invocation in the sibling-resync bullet

Review nit on #431: the parenthetical named git merge-tree/gh pr diff
without showing what arguments to pass. Spell out the actual invocation.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B2aHbEXwTUA13vYMuQXqas

---------

Co-authored-by: Claude <noreply@anthropic.com>
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.

claude-review stub-review flake reproduces 3x with identical permission_denials_count: 1 signature

2 participants