Skip to content

Review mode: expired GitHub App token silently fails submit_pending_pull_request_review, job still reports success #57

Description

@Mearman

Ran into this on novus-power/hive PR #1979 (a trivial 4-line diagnostic-logging change). The review job (mode: review, workflow_run trigger) took over an hour end to end -- it hit a context-compaction/resume partway through, which pushed the run well past the GitHub App installation token's TTL.

By the time the agent got to submitting the review, every mcp__github__ call started failing with:

failed to get current user: non-200 OK status code: 401 Unauthorized body: "{\r\n  \"message\": \"Bad credentials\",\r\n  \"documentation_url\": \"https://docs.github.com/rest\",\r\n  \"status\": \"401\"\r\n}"

It had already called create_pending_pull_request_review successfully (token still valid then), then add_comment_to_pending_review failed on an unrelated GraphQL validation error (missing subjectType), then after the compaction/resume, submit_pending_pull_request_review failed twice with the 401 above. The job's own top-level conclusion was still "success" -- nothing surfaced this failure anywhere a human or the calling workflow could see it. The PR sat with reviewDecision: REVIEW_REQUIRED indefinitely, with zero reviews ever actually posted, and no comment/error visible anywhere on the PR itself.

Two separate things worth fixing:

  1. The App token should be refreshed if it's stale before the final review-submission call, not just minted once at job start -- the reusable action already has an OIDC exchange for the App token (this exact repo's claude-review.yml comment mentions id-token: write for it), so a mid-run refresh should be mechanically possible.
  2. Regardless of (1), a submit_pending_pull_request_review failure (or any core review-submission tool failure) should make the job itself fail rather than reporting success -- silent failure here means the calling repo's own claude-review.yml can never distinguish "genuinely nothing to say" from "the review never actually happened."

Workaround used on the affected PR: manually re-ran the same review job (gh run rerun), which completed within the token's TTL the second time.

Triage summary

  • Kind: Bug report.
  • Area: Review mode's App-identity (OIDC) path in action.yml -- specifically the pinned anthropics/claude-code-action call's token minting/TTL, and the lack of a post-hoc check confirming a review was actually submitted.
  • Duplicates: None found among this repo's open/closed issues.
  • Severity: Silent failure (green run, no review posted, no visible error) on a narrow but real path -- App-identity review, long session with a compaction/resume, workflow_run-triggered timing. First-hand reproduction with real tool-call logs from novus-power/hive, not just a claim of urgency.
  • Two separable asks: (1) mid-session App-token refresh -- likely an upstream (anthropics/claude-code-action) concern, not fixable in this wrapper's action.yml alone; (2) failing the job when submit_pending_pull_request_review never succeeds -- addressable here, e.g. a review-mode analogue of the existing triage-only "verify actual output" check around action.yml:2121.
  • Missing info: confirmation of which trigger (workflow_run vs. the documented pull_request) is required to reproduce the token-TTL timing.
  • Labelled: bug.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions