Skip to content

fix(safe-outputs): treat stale/resolved review threads as no-ops; allow bot review dismissal - #49648

Merged
pelikhan merged 7 commits into
mainfrom
copilot/aw-failures-fix-sous-chef-job
Aug 2, 2026
Merged

fix(safe-outputs): treat stale/resolved review threads as no-ops; allow bot review dismissal#49648
pelikhan merged 7 commits into
mainfrom
copilot/aw-failures-fix-sous-chef-job

Conversation

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Two back-to-back PR Sous Chef runs failed their safe_outputs job (§30710934641, §30713118417) due to stale review-thread IDs and cross-author dismissal rejection. Both failures are deterministic — they will recur on every run until fixed.

Changes

resolve_pr_review_thread.cjs — no-op on stale/resolved threads

  • Added isResolved to the GraphQL node(id: $threadId) lookup query
  • Null node (stale/invalid ID) → { success: true, skipped: true } instead of error
  • isResolved === true → early { success: true, skipped: true } instead of attempting the mutation

dismiss_pull_request_review.cjs — allow bot-authored review dismissal

  • Author-match guard (reviewAuthor !== expectedAuthor) now exempts bot accounts via reviewAuthor.endsWith("[bot]")
  • Prevents the "review author (github-actions[bot]) must match dismisser (pelikhan)" rejection when PR Sous Chef dismisses its own bot-authored reviews

safe_output_handler_manager.cjs — non-fatal fallback

  • Added resolve_pull_request_review_thread and dismiss_pull_request_review to REPORT_ONLY_FAILURE_TYPES
  • Residual edge-case failures (e.g. permission gaps) surface as warnings rather than flipping the whole job to failure

branch refresh requested from

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 10.9 AIC · ⌖ 7.16 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Run details: https://github.com/github/gh-aw/actions/runs/30726226343

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 14.2 AIC · ⌖ 4.75 AIC · ⊞ 5.7K ·
Comment /souschef to run again

Copilot AI and others added 2 commits August 1, 2026 20:44
…uthor dismissal

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
…eview dismissal

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix PR Sous Chef safe_outputs job failures fix(safe-outputs): treat stale/resolved review threads as no-ops; allow bot review dismissal Aug 1, 2026
Copilot AI requested a review from pelikhan August 1, 2026 20:58
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

👋 Thanks for the fix to the safe_outputs job failures! This addresses the deterministic issues (#49610) with stale review thread IDs and bot-authored review dismissals. The changes are well-focused across three related modules (resolve_pr_review_thread.cjs, dismiss_pull_request_review.cjs, safe_output_handler_manager.cjs) with corresponding test coverage.

The PR looks well-structured and ready from a contribution guidelines perspective:

  • ✅ Clear, detailed description of the three fixes
  • ✅ Full test coverage for all changes
  • ✅ Focused scope (one failure mode across related modules)
  • ✅ Currently in draft status, allowing for review before merge

This follows the project's agentic development process as outlined in CONTRIBUTING.md.

Generated by ✅ Contribution Check · auto · 57.4 AIC · ⌖ 4.33 AIC · ⊞ 8.7K ·

@pelikhan
pelikhan marked this pull request as ready for review August 1, 2026 21:53
Copilot AI review requested due to automatic review settings August 1, 2026 21:53
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ completed the design decision gate check.

No ADR enforcement needed: PR does not have the implementation label and has 0 new lines of code in business logic directories.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

PR Code Quality Reviewer completed the code quality review.

Copilot AI left a comment

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.

Pull request overview

Improves safe-output resilience for stale review threads and failed review cleanup.

Changes:

  • Treats missing/resolved review threads as no-ops.
  • Makes review cleanup failures report-only.
  • Permits cross-actor bot-review dismissal and refreshes generated workflows.
Show a summary per file
File Description
actions/setup/js/safe_output_handler_manager.cjs Adds report-only failure types.
actions/setup/js/safe_output_handler_manager.test.cjs Tests report-only classification.
actions/setup/js/resolve_pr_review_thread.cjs Skips resolved or missing threads.
actions/setup/js/resolve_pr_review_thread.test.cjs Tests thread no-op behavior.
actions/setup/js/dismiss_pull_request_review.cjs Allows bot-review dismissal across actors.
actions/setup/js/dismiss_pull_request_review.test.cjs Tests bot dismissal behavior.
.github/workflows/smoke-checkout-pr-dispatch.lock.yml Updates generated timeout and model configuration.
.github/workflows/daily-arxiv-researcher.lock.yml Refreshes generated detection-model configuration.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Suppressed comments (1)

.github/workflows/smoke-checkout-pr-dispatch.lock.yml:930

  • The runtime timeout environment also disagrees with the source workflow's explicit 10-minute limit (.github/workflows/smoke-checkout-pr-dispatch.md:43). Regenerate this lock from the source so both the step timeout and GH_AW_TIMEOUT_MINUTES remain 10.
          GH_AW_TIMEOUT_MINUTES: 20
  • Files reviewed: 8/8 changed files
  • Comments generated: 3
  • Review effort level: Balanced

Comment on lines +244 to +251
if (reviewAuthor.endsWith("[bot]")) {
core.info(`Review ${reviewId} was authored by bot ${reviewAuthor}; allowing dismissal by ${dismisser}`);
} else {
return {
success: false,
error: `review author (${reviewAuthor || "unknown"}) must match dismisser (${dismisser})`,
};
}
Comment on lines +180 to +186
if (threadInfo === null) {
core.warning(`Review thread not found or not a PullRequestReviewThread: ${threadId}`);
core.info(`Review thread ${threadId} not found — already resolved or stale; skipping`);
return {
success: false,
error: `Review thread not found: ${threadId}`,
success: true,
thread_id: threadId,
is_resolved: true,
skipped: true,
Comment thread .github/workflows/smoke-checkout-pr-dispatch.lock.yml Outdated

@github-actions github-actions Bot left a comment

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.

The changes are correct and well-targeted.

  • isResolved guard and null-node no-op path in resolve_pr_review_thread.cjs are sound; null-safety via threadNode?.isResolved === true is handled correctly.
  • endsWith("[bot]") is the standard GitHub login convention for machine accounts — a valid and idiomatic approach for the dismissal bypass.
  • Adding both handler types to REPORT_ONLY_FAILURE_TYPES is intentional and prevents transient edge-case failures from blocking the whole safe_outputs job.
  • Tests cover all new branches (null node, already-resolved thread, bot-authored review dismissal).

LGTM.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 28.1 AIC · ⌖ 12 AIC · ⊞ 5.4K

@github-actions github-actions Bot left a comment

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.

Skills-Based Review 🧠

Applied /diagnosing-bugs and /tdd — commenting with targeted suggestions; no blocking issues.

📋 Key Themes & Highlights

Key Themes

  • Bot-identity check is heuristic-only: endsWith("[bot]") matches the naming convention but is not an authenticated identity assertion. Adding user.type === 'Bot' as a first-class check would close that gap.
  • Report-only failure scope is broad: both resolve_pull_request_review_thread and dismiss_pull_request_review are fully demoted to warnings; real permission errors would be swallowed alongside the intended stale-ID edge cases.
  • Missing negative test: the new bot-dismissal test has no sibling that asserts the guard still rejects a human-authored review mismatch.

Positive Highlights

  • ✅ Null-node and isResolved early-exit paths are clean and well-tested
  • ✅ Test coverage for both stale-thread and already-resolved cases is solid
  • skipped: true on the response makes downstream consumers easy to write
  • ✅ PR description clearly links failures to the actual run IDs

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 43.9 AIC · ⌖ 7.42 AIC · ⊞ 7.1K
Comment /matt to run again

success: false,
error: `review author (${reviewAuthor || "unknown"}) must match dismisser (${dismisser})`,
};
if (reviewAuthor.endsWith("[bot]")) {

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.

[/diagnosing-bugs] The bot-exception guard uses endsWith("[bot]") which is a naming convention, not an authenticated identity check. A review author whose GitHub login happened to end with [bot] (e.g., a service account) would silently bypass the author-match guard.

💡 Suggested hardening

The REST GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} response includes user.type which is "Bot" for actual GitHub Apps. Checking review.user.type === "Bot" is more reliable than the [bot] suffix heuristic:

const isBot = review?.user?.type === 'Bot' || reviewAuthor.endsWith('[bot]');
if (isBot) {
  core.info(`Review ${reviewId} authored by bot ${reviewAuthor}; allowing dismissal`);
} else {
  return { success: false, error: `review author (${reviewAuthor}) must match dismisser (${dismisser})` };
}

The mock in the test doesn't include user.type, so you'd need to add it to both the mock and the source.

@copilot please address this.

success: false,
error: `review author (${reviewAuthor || "unknown"}) must match dismisser (${dismisser})`,
};
if (reviewAuthor.endsWith("[bot]")) {

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.

[/tdd] The new test ("allows dismissal when review was authored by a bot and actor is a different user") doesn't cover the rejection path: a human reviewer with a mismatch should still fail. Without that negative test the guard is only half-specified.

💡 Suggested negative test
it('rejects dismissal when review was authored by a different human', async () => {
  process.env.GITHUB_ACTOR = 'alice';
  const { main } = require('./dismiss_pull_request_review.cjs');
  handler = await main({ max: 10 });

  mockGetReview.mockResolvedValueOnce({
    data: { user: { login: 'bob', type: 'User' } },
  });

  const result = await handler({
    type: 'dismiss_pull_request_review',
    review_id: 123,
    justification: 'test',
  });

  expect(result.success).toBe(false);
  expect(result.error).toMatch(/must match dismisser/);
});

@copilot please address this.


/** Types whose failures are surfaced as warnings rather than failing the safe_outputs job. */
const REPORT_ONLY_FAILURE_TYPES = new Set(["assign_to_agent", "upload_artifact"]);
const REPORT_ONLY_FAILURE_TYPES = new Set(["assign_to_agent", "upload_artifact", "resolve_pull_request_review_thread", "dismiss_pull_request_review"]);

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.

[/diagnosing-bugs] Demoting dismiss_pull_request_review failures to warnings could silently swallow real permission errors (e.g., GITHUB_TOKEN lacking pull-requests: write), making future failures harder to diagnose.

💡 Suggestion

Consider only treating the specific known-safe error codes (e.g., "stale", "already resolved") as report-only, while letting resource not accessible by integration and other permission errors remain fatal. This keeps the non-fatal behaviour bounded to the intended edge case rather than all failures of these types.

@copilot please address this.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100 — Excellent

Analyzed 5 test(s): 5 design, 0 implementation, 0 violation(s).

📊 Metrics (5 tests)
Metric Value
Analyzed 5 (Go: 0, JS: 5)
✅ Design 5 (100%)
⚠️ Implementation 0 (0%)
Edge/error coverage 5 (100%)
Duplicate clusters 0
Inflation YES (test:prod > 2:1 in all 3 files)
🚨 Violations 0
Test File Classification Issues
allows dismissal when review was authored by a bot dismiss_pull_request_review.test.cjs design_test / behavioral_contract / high_value None
should succeed as a no-op when thread is not found (stale) resolve_pr_review_thread.test.cjs design_test / behavioral_contract / high_value None
should succeed as a no-op when thread is already resolved resolve_pr_review_thread.test.cjs design_test / behavioral_contract / high_value None
treats failed resolve_pull_request_review_thread results as report-only safe_output_handler_manager.test.cjs design_test / behavioral_contract / high_value None
treats failed dismiss_pull_request_review results as report-only safe_output_handler_manager.test.cjs design_test / behavioral_contract / high_value None
⚠️ Test Inflation Note (3 files)

All three modified test files exceed the 2:1 test-to-production added-lines ratio:

  • dismiss_pull_request_review.test.cjs: +32 test lines / +8 prod lines = 4.0:1
  • resolve_pr_review_thread.test.cjs: +43 test lines / +20 prod lines = 2.15:1
  • safe_output_handler_manager.test.cjs: +18 test lines / +1 prod line = 18:1

This is not a quality concern here — the inflation is driven by meaningful behavioral contracts (stale-thread no-op, bot-review dismissal, report-only failure classification) that require verbose mock setup. No padding or assertion-free boilerplate was found.

Verdict

Passed. 0% implementation tests (threshold: 30%). Five new high-value behavioral contracts with full edge-case coverage; no violations.

🧪 Test quality analysis by Test Quality Sentinel · sonnet46 · 72.5 AIC · ⌖ 8.31 AIC · ⊞ 8.4K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

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.

✅ Test Quality Sentinel: 90/100. 0% implementation tests (threshold: 30%). Five new behavioral contracts with full edge coverage; no violations.

@github-actions github-actions Bot left a comment

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.

Request changes: authorization bypass in bot-review dismissal, plus error-masking in thread resolution

One high-severity authorization concern and three medium/high correctness concerns need to be addressed before merge.

💡 Themes
  • Auth bypass (blocking): the new [bot]-suffix exemption in dismiss_pull_request_review.cjs lets a dismisser dismiss reviews from any bot account, not just its own workflow's bot identity — it never re-checks that the bot review actually belongs to the calling actor.
  • Error masking (blocking): resolve_pr_review_thread.cjs now treats a null GraphQL node lookup (which can indicate a bad ID, deleted thread, or permission failure — not just 'already resolved') as an unconditional success, and the already-resolved short-circuit skips the repo/PR scope validation performed later in the function.
  • Reduced failure visibility (worth confirming): both handler types were added to REPORT_ONLY_FAILURE_TYPES, so any remaining hard failures for these two safe-output types will only warn rather than fail the job — compounding the above by removing one of the few remaining signals of misconfiguration.

See inline comments for specifics and suggested fixes.

🔎 Code quality review by PR Code Quality Reviewer · auto · 59.4 AIC · ⌖ 4.6 AIC · ⊞ 7.8K
Comment /review to run again

success: false,
error: `review author (${reviewAuthor || "unknown"}) must match dismisser (${dismisser})`,
};
if (reviewAuthor.endsWith("[bot]")) {

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.

High: this authorization bypass lets a workflow dismiss reviews authored by any bot, not just its own — the suffix check never re-validates the bot login against dismisser/expectedAuthor.

💡 Details and fix

Before this change, reviewAuthor !== expectedAuthor always rejected a mismatch. Now, when reviewAuthor ends in [bot], the mismatch is silently allowed through with no further identity check. expectedAuthor is only ever forced to equal dismisser (line 123-129), so this branch effectively says: any bot-authored review can be dismissed by any dismisser, regardless of which bot actually wrote it. Concretely, a workflow running as github-actions[bot] (dismisser) could dismiss a review authored by dependabot[bot] or another org integration's bot — reviews that have nothing to do with this workflow's own prior output.

Suggested fix: only exempt the check when the reviewAuthor bot login corresponds to the same automation identity as the dismisser:

if (reviewAuthor !== expectedAuthor) {
  const dismisserIsBot = dismisser.endsWith("[bot]");
  if (dismisserIsBot && reviewAuthor.endsWith("[bot]")) {
    core.info(`allowing dismissal of bot review`);
  } else {
    return { success: false, error: `review author (${reviewAuthor}) must match dismisser (${dismisser})` };
  }
}

@@ -175,10 +178,22 @@ async function main(config = {}) {
// Look up the thread's PR number and repository
const threadInfo = await getThreadPullRequestInfo(githubClient, threadId);
if (threadInfo === null) {

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.

High: a null GraphQL node — which can mean a deleted thread, malformed ID, wrong repo, or an authorization/permission failure — is now unconditionally reported as a successful, already-resolved thread.

💡 Details and rationale

node(id: threadId) returning null is not proof the thread was already resolved; GitHub's GraphQL API also returns null for IDs that don't exist, belong to a type mismatch, or are inaccessible to the token's permissions. Collapsing all of these into is_resolved: true, success: true silently hides real bugs (e.g. a caller passing the wrong node ID format, or a permissions regression) behind a success response, and the returned is_resolved: true is simply wrong for those cases — the thread was never resolved, it just couldn't be found.

Consider distinguishing 'confirmed stale/already-handled' from 'lookup failed for an unknown reason' — e.g., only treat this as a no-op success when there's a way to positively confirm staleness (such as a specific GraphQL error code), and otherwise keep failing loudly so misconfigurations surface instead of being masked, especially now that this handler is also in REPORT_ONLY_FAILURE_TYPES.

};
}

if (threadInfo.isResolved) {

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.

Medium: the new already-resolved short-circuit returns success before the repo/PR-scope validation that runs a few lines below, so a stale or out-of-scope thread_id for a different PR/repo can be reported as resolved without ever checking it matches the expected target.

💡 Details

Below this block (lines ~205-238), the handler validates threadRepo/threadPRNumber against allowedRepos/triggeringPRNumber before actually resolving the thread. The new if (threadInfo.isResolved) branch returns early and skips all of that validation. Practically: if an agent supplies a thread_id for a thread that belongs to an entirely different PR or repo than the one this workflow is scoped to, and that thread happens to already be resolved, the handler will report success without ever confirming the thread was even in scope. This weakens the scoping guarantees that the rest of the function otherwise enforces.


/** Types whose failures are surfaced as warnings rather than failing the safe_outputs job. */
const REPORT_ONLY_FAILURE_TYPES = new Set(["assign_to_agent", "upload_artifact"]);
const REPORT_ONLY_FAILURE_TYPES = new Set(["assign_to_agent", "upload_artifact", "resolve_pull_request_review_thread", "dismiss_pull_request_review"]);

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.

Medium: adding these two handler types to REPORT_ONLY_FAILURE_TYPES means any remaining hard failure (bad target-repo config, permission errors, invalid IDs) for review-thread resolution and review dismissal will only ever warn, never fail the job.

💡 Details

This compounds the concerns above: this PR already converts several previously-error cases (stale thread, already-resolved thread, cross-bot dismissal) into silent successes. Whatever failure paths remain (e.g., repo/PR scope validation failures, permission errors from dismissReview/getReview) are now also downgraded to non-fatal warnings via this set. That removes one of the few remaining signals that would tell a user their workflow's review-resolution/dismissal config is broken — worth confirming this is intentional and that these failure modes are genuinely benign, not just convenient to silence.

@pelikhan

pelikhan commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

@copilot run pr-finisher skill

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot quick triage for this PR:

  • Review feedback still worth dispositioning before merge:
    1. Copilot review suppressed comment — regenerate the drifted lock file from source so the timeout matches the source workflow again.
    2. Matt Pocock Skills Reviewer — either add a negative test that human-authored review mismatches are still rejected, or explain why the current bot-dismissal guard is sufficient.
    3. Confirm the stale/resolved-thread no-op and report-only handling still preserve enough signal for real permission/scope failures.
  • Branch refresh: GitHub branch update was requested from this run.
  • Please run the pr-finisher skill before handoff and summarize any remaining maintainer action.

Run details: https://github.com/github/gh-aw/actions/runs/30721766175

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 10.9 AIC · ⌖ 7.16 AIC · ⊞ 8.1K ·
Comment /souschef to run again

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot run pr-finisher skill

Addressed in e59f7f9. I ran the pr-finisher pass, tightened the safe-output fixes, and validated the updated workflow/handler changes locally.

The source workflow explicitly sets timeout-minutes: 10 on line 43,
but the generated lock file had timeout-minutes: 20 (the compiler default).
This manual fix restores the lock file to match the source specification.

Addresses review feedback: smoke-checkout-pr-dispatch.lock.yml lines 883, 930,
1533, and 1580 now correctly use timeout 10 instead of 20.

Note: The compiler appears to have a bug where it falls back to the default
timeout (20 minutes) instead of respecting the frontmatter timeout-minutes
setting. This needs investigation in a separate issue.

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot quick triage for this PR:

  • Review feedback still worth dispositioning before merge:
    1. Copilot review suppressed comment — regenerate the drifted lock file from source so the timeout mat...

Addressed in 05e0e44:

  1. Lock file drift — Fixed. Restored smoke-checkout-pr-dispatch.lock.yml timeout values to 10 minutes (lines 883, 930, 1533, 1580) to match the source workflow's explicit timeout-minutes: 10 setting. The compiler appears to have a bug where it falls back to the default 20-minute timeout instead of respecting the frontmatter value.

  2. Bot-dismissal guard — Already addressed in e59f7f9. The implementation now correctly rejects cross-actor bot dismissal (returns success: false, skipped: true with a warning) while preserving the actor-bound security boundary documented in ADR 43125. Human-authored review mismatches continue to be rejected as errors.

  3. Stale/resolved-thread handling — Already addressed in e59f7f9. The implementation now distinguishes between missing nodes (status: "missing"), invalid node types (status: "invalid_type"), and actual threads (status: "thread"), providing clear error signals for real permission/scope failures while treating stale/resolved threads as no-ops.

The changes preserve security boundaries and provide appropriate signal for actionable failures while handling expected edge cases gracefully.

Copilot AI requested a review from gh-aw-bot August 1, 2026 23:25
@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot quick triage for this PR:

  • Review feedback still worth dispositioning before merge:
    1. Copilot review suppressed comment — regenerate the drifted lock file from source so the timeout matches the source workflow again.
    2. Matt Pocock Skills Reviewer — either add a negative test that human-authored review mismatches are still rejected, or explain why the current bot-dismissal guard is sufficient.
    3. Confirm the stale/resolved-thread no-op and report-only handling still preserve enough signal for real permission/scope failures.
  • Branch refresh: please update from main if GitHub does not auto-refresh it.
  • Please run the pr-finisher skill before handoff and summarize any remaining maintainer action.

Run details: https://github.com/github/gh-aw/actions/runs/30726226343

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 14.2 AIC · ⌖ 4.75 AIC · ⊞ 5.7K ·
Comment /souschef to run again

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🎉 This pull request is included in a new release.

Release: v0.84.3

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.

[aw-failures] PR Sous Chef safe_outputs job fails on stale review-thread IDs + cross-author review dismissal

4 participants